自动将所有模型字段添加到 django rest 序列化程序

Automatically add all model fields to django rest serializer

当我定义 ModelSerializer 时,meta class 可用于定义要序列化的字段,它会自动继承模型中的所有字段:

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

问题:在这种情况下,我必须手动将 所有 客户端字段添加到字段元组中。我不想这样做,因为它看起来很重复并且对错误敏感。我如何将 "plus-1" 字段(在本例中为地址)添加到使用 ModelSerialzer 时包含的默认字段???

注意:这是一个简化的示例。我的模型有 40 多个字段,我必须对嵌套模型使用 SerializerMethodField,因为我必须将上下文数据(用户信息)传递给序列化程序以实现我已经实现的字段级身份验证。

(更新,地址是一个SerializerMethodField,名字搞混了)

默认情况下,如果 Meta 中未定义 fields 参数,则 ModelSerializer return 的所有模型字段。
类似地,对于正常的 serializers.Serializer,它将 return 序列化程序中定义的所有字段(read-only 字段除外)。

仅当您希望 return 编辑所有字段的子集时,才必须在 Meta class 中指定 fields

(来自 DRF 文档)

If you only want a subset of the default fields to be used in a model serializer, you can do so using fields or exclude options.

所以不要在 Meta class 中指定 fields 参数,它应该 return 所有字段。

您需要的是模型中的字段列表。可在 model._meta.fields 内到达。此时,如果字段 address 不是模型的一部分,您可以添加它。

更好的是,在 django 1.8 中,您可以使用 model.get_fields。 doc