当使用Django REST Framework中的HyperlinkedModelSerializer
时,id
字段默认不包含在fields
中。这个question有一个解释很好的答案。
但是我有一个问题,我想以特定的方式解决。
我有一个带有自定义ID的模型和几十个其他领域:
class Foo(models.Model):
id = models.IntegerField(primary_key=True)
# 20-30 fields
在serializers.py
中,我想要包含模型中的所有字段:
class FooSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Foo
fields = '__all__'
但是这不包括id
字段。定义id = serializers.ReadOnlyField()
对我也没有帮助,因为id
应该是可编辑的。
手动指定所有字段,如下所示:
fields = ('id', # all other fields)
将是一个我试图规避的解决方案,因为模型类有很多字段,它们将来可能会改变。
有没有优雅的可能性添加字段id
?也许压倒__init__
方法?
在id
序列化程序中添加FooSerializer
属性为:
class FooSerializer(serializers.HyperlinkedModelSerializer):
id = serializers.IntegerField(read_only=True)
class Meta:
model = Foo
fields = '__all__'
您可以创建自定义HyperlinkedModelSerializer并覆盖get_default_field_names
以包含像普通ModelSerializer那样的ID。
例:
class CustomHyperlinkedModelSerializer(HyperlinkedModelSerializer ):
def get_default_field_names(self, declared_fields, model_info):
return (
[model_info.pk.name] +
[self.url_field_name] +
list(declared_fields) +
list(model_info.fields) +
list(model_info.forward_relations)
)
注意:这只是一个想法。我还没有测试过。
HyperlinkedModelSerializer
默认不包括id
字段。您可以通过将id
作为属性添加到序列化程序中来包含class FooSerializer(serializers.HyperlinkedModelSerializer):
id = serializers.IntegerField()
class Meta:
model = Foo
fields = '__all__'
:
qazxswpoi