随心一记

一二三四五,上山打老鼠


  • 首页

  • 归档

  • 标签
ywcsb

ywcsb

游戏可以不玩,小说不能不看。

153 日志
3 分类
42 标签
RSS
GitHub 知乎 随心一记
Links
  • 随心一记
  • 追梦人物的
  • MSDN

django restframework serializer 增加自定义字段

发表于 2021-05-15 | 阅读 782 | 分类于 Python |

在使用django restframework serializer 序列化在django中定义的model时,有时候我们需要额外在serializer中增加一些model中没有的字段。有两种方法实现这个目的。

​ 假设现在有一个Animal模型,其中有name, type, country字段,country为外键。我们在序列化Animal时,需要额外增加外键country的area信息。

方法一:

  1. 首先,在django的model中定义property
   class Animal(models.Model):
       name = models.CharField(max_length=50, default='')
       type = models.CharField(max_length=50, default='')
       country = models.ForeignKey(Country, blank=True, null=True)

       @property
       def country_area(self):
           return self.country.area
  1. 然后在定义django restframework的serializer时,使用字段的source参数指向我们上面定义好的property。
   class AnimalSerializer(serializers.Serializer):
       pk = serializers.IntegerField(read_only=True)
       name = serializers.CharField(max_length=50)
       type = serializers.CharField(max_length=50)
       country = serializers.PrimaryKeyRelatedField(read_only=True)
       country_area = serializers.FloatField(required=False, source='country_area’)

方法二:

不修改django的model,直接使用SerializerMethodField(method_name=None)字段

class AnimalSerializer(serializers.ModelSerializer):
    country_area = serializers.SerializerMethodField()

    class Meta:
        model = Animal
        fields = ('id', 'name', 'type','country','country_area')

    def get_country_area(self, obj):
        return obj.country.area 

几点说明:

  1. SerializerMethodFiel是一个read-only字段
  2. 当不指定其method_name时,默认为get_<field_name>
  3. 如果使用ModelSerializer并指定字段时,要包含此时定义的字段
觉得不错,支持一下!
geerniya WeChat Pay

微信打赏

geerniya Alipay

支付宝打赏

# Python # Django
CentOS7进入救援模式,修复fstab错误
django rest_framwork pagination 自定义返回数据格式

发表评论

共 0 条评论

    暂无评论
© 2018 - 2022 ywcsb
冀ICP备17022045号-1
Supported by 腾讯云