当我定义ModelSerializer时,元类可用于定义要序列化的字段,它会自动继承模型中的所有字段:
class ClientSerializer(ModelSerializer):
class Meta:
model = Client
我必须构建一个嵌套的序列化程序(基于SerializerMethodField)。所以我必须定义要包括的字段:
class ClientSerializer(ModelSerializer)
address = SerializerMethodField('get_client_addresses')
class Meta:
model = Client
fields = ('address','name','city', <etc*>)
def get_client_addresses(self, obj):
addresses = Addresses.objects.all().filter(parent=obj)
serializer = AddressSerializer(addresses, many=True,
context={'request', self.context.get('request') })
return serializer.data
问题:在这种情况下,我必须手动将所有客户端字段添加到fields-tuple。我不想这样做,因为它似乎非常重复和故障敏感。如何添加&#34; plus-1&#34;字段(在本例中为地址)到使用ModelSerialzer时包含的默认字段???
注意:这是一个简化的例子。我有40多个字段的模型,我必须使用SerializerMethodField作为嵌套模型,因为我必须将上下文数据(user-info)传递给序列化器,以便我实现字段级认证。
(更新,地址是一个SerializerMethodField,名字混淆了)
答案 0 :(得分:3)
默认情况下,如果ModelSerializer
中未定义fields
参数,Meta
将返回所有模型字段。
与普通serializers.Serializer
类似,它将返回序列化程序中定义的所有字段(read-only
字段除外)。
只有在想要返回所有字段的子集时,才必须在fields
类中指定Meta
。
(来自DRF文档)
如果您只想在模型中使用默认字段的子集 序列化程序,您可以使用
fields
或exclude
选项执行此操作。
所以,不要在fields
类中指定Meta
参数,它应该返回所有字段。
答案 1 :(得分:0)
您需要的是模型中的字段列表。它可以在model._meta.fields
中访问。此时,如果字段address
不属于您的模型,则可以添加该字段。
更好的是,使用django 1.8,您可以使用model.get_fields。 doc