zoukankan      html  css  js  c++  java
  • django restframework serializer 增加自定义字段

    在使用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
      

    2.然后在定义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并指定字段时,要包含此时定义的字段
  • 相关阅读:
    Vim常用命令
    [转载] Java注解
    学习Zookeeper之第3章Zookeeper内部原理
    学习Zookeeper之第2章Zookeeper安装
    学习Zookeeper之第1章Zookeeper入门
    《Effective Java 2nd》第8章 通用程序设计
    《Effective Java 2nd》第7章 方法
    Log4j2报错ERROR StatusLogger Unrecognized format specifier
    比较三个数,求最大数字 ( 应用条件运算符:?)
    两个数字比较大小的方法 (分别应用if-else和条件运算符实现)
  • 原文地址:https://www.cnblogs.com/rinka/p/django_restframework_serializer_add_custom_field.html
Copyright © 2011-2022 走看看