【问题标题】:How to add new serializer field along with the all model fields?如何添加新的序列化器字段以及所有模型字段?
【发布时间】:2023-04-09 23:42:01
【问题描述】:

这里我有一个模型,它有很多领域。所以我想用__all__ 来返回所有的字段。但是现在我需要添加新字段image_url,所以我自定义了一个这样的序列化程序,但是现在我需要将所有模型字段放在Meta 类中,就像fields=['name','..', 'image_url'] 这样才能返回image_url

有什么方法可以返回 image_url 而无需在 Meta.fields 中指定它? 我的意思是我不想在Meta.fields 中写入所有模型字段(因为字段太多)并且还想返回image_url

序列化器.py

class MySerializer(ModelSerializer):
    image_url = serializers.SerializerMethodField('get_image_url')

    class Meta:
        model = MyModel
        fields = '__all__'
    def get_image_url(self, obj):
        return obj.image.url

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    试试这个:

    class MySerializer(ModelSerializer):
        image_url = serializers.SerializerMethodField()
    
        class Meta:
            model = MyModel
            fields = [f.name for f in MyModel._meta.fields] + ['image_url']
        def get_image_url(self, obj):
            return obj.image.url
    

    【讨论】:

      【解决方案2】:

      你可以尝试子类化 te 序列化器:

      class MySerializer(ModelSerializer):
      
          class Meta:
              model = MyModel
              fields = '__all__'
      
      
      class MyChildSerializer(MySerializer):
      
          image_url = serializers.SerializerMethodField()
      
          class Meta:
              fields = MySerializer.Meta.fields + ['image_url']
      
          def get_image_url(self, obj):
              return obj.image.url
      

      从未尝试过这样的事情,但由于Meta.fields 是一个列表,您可以对其执行基本的python 操作。

      ps。如果您使用模式 get_<field_name> 作为 getter,则无需在 SerializerMethodField 参数中指定它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多