首页 文章

自动将所有模型字段添加到django rest serializer

提问于
浏览
2

当我定义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

Question :在这种情况下,我必须手动将所有客户端字段添加到fields-tuple . 我不想这样做,因为它似乎非常重复和故障敏感 . 如何将"plus-1"字段(在本例中为地址)添加到使用ModelSerialzer时包含的默认字段中?

注意:这是一个简化的例子 . 我有40个字段的模型,我必须使用SerializerMethodField作为嵌套模型,因为我必须将上下文数据(user-info)传递给序列化器,以便我实现的字段级认证 .

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

2 回答

  • 0

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

    仅当您希望返回所有字段的子集时,才必须在 Meta 类中指定 fields .

    (From the DRF docs)

    如果您只想在模型序列化程序中使用默认字段的子集,则可以使用字段或排除选项来执行此操作 .

    所以只是不要在 Meta 类中指定 fields 参数,它应该返回所有字段 .

  • 3

    您需要的是模型中的字段列表 . 它可以在 model._meta.fields 到达 . 此时,如果字段 address 不属于您的模型,则可以添加该字段 .

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

相关问题