在使用django restframework serializer 序列化在django中定義的model時,有時候咱們須要額外在serializer中增長一些model中沒有的字段。有兩種方法實現這個目的。django
假設如今有一個Animal模型,其中有name, type, country字段,country爲外鍵。咱們在序列化Animal時,須要額外增長外鍵country的area信息。ui
方法一:spa
1.首先,在django的model中定義propertyrest
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參數指向咱們上面定義好的propertycode
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’)
方法二:blog
不修改django的model,直接使用SerializerMethodField(method_name=None)字段get
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
幾點說明:class
- SerializerMethodFiel是一個read-only字段
- 當不指定其method_name時,默認爲get_<field_name>
- 若是使用ModelSerializer並指定字段時,要包含此時定義的字段