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並指定字段時,要包含此時定義的字段

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM