四、模型类序列化器ModelSerializer
如果我們想要使用序列化器對應的是Django的模型類,DRF為我們提供了ModelSerializer模型類序列化器來幫助我們快速創建一個Serializer類。
ModelSerializer與常規的Serializer相同,但提供了:
- 基于模型類自動生成一系列字段
- 包含默認的create()和update()的實現
1、 定義
比如我們創建一個BookInfoSerializer
class BookInfoSerializer(serializers.ModelSerializer):"""圖書數據序列化器"""class Meta:model = BookInfofields = '__all__'model 指明參照哪個模型類
fields 指明為模型類的哪些字段生成
我們可以在python manage.py shell中查看自動生成的BookInfoSerializer的具體實現
>>> from booktest.serializers import BookInfoSerializer >>> serializer = BookInfoSerializer() >>> serializer BookInfoSerializer():id = IntegerField(label='ID', read_only=True)btitle = CharField(label='名稱', max_length=20)bpub_date = DateField(allow_null=True, label='發布日期', required=False)bread = IntegerField(label='閱讀量', max_value=2147483647, min_value=-2147483648, required=False)bcomment = IntegerField(label='評論量', max_value=2147483647, min_value=-2147483648, required=False)2、指定字段
1)使用fields來明確字段,__all__表名包含所有字段,也可以寫明具體哪些字段,如
class BookInfoSerializer(serializers.ModelSerializer):"""圖書數據序列化器"""class Meta:model = BookInfofields = ('id', 'btitle', 'bpub_date')2)使用exclude可以明確排除掉哪些字段
class BookInfoSerializer(serializers.ModelSerializer):"""圖書數據序列化器"""class Meta:model = BookInfoexclude = ('image',)3)顯示指明字段,如:
class HeroInfoSerializer(serializers.ModelSerializer):hbook = BookInfoSerializer()class Meta:model = HeroInfofields = ('id', 'hname', 'hgender', 'hcomment', 'hbook')4)指明只讀字段
可以通過read_only_fields指明只讀字段,即僅用于序列化輸出的字段
class BookInfoSerializer(serializers.ModelSerializer):"""圖書數據序列化器"""class Meta:model = BookInfofields = ('id', 'btitle', 'bpub_date', 'bread', 'bcomment')read_only_fields = ('id', 'bread', 'bcomment')3、添加額外參數
我們可以使用extra_kwargs參數為ModelSerializer添加或修改原有的選項參數
class BookInfoSerializer(serializers.ModelSerializer):"""圖書數據序列化器"""class Meta:model = BookInfofields = ('id', 'btitle', 'bpub_date', 'bread', 'bcomment')extra_kwargs = {'bread': {'min_value': 0, 'required': True},'bcomment': {'min_value': 0, 'required': True},}# BookInfoSerializer(): # id = IntegerField(label='ID', read_only=True) # btitle = CharField(label='名稱', max_length=20) # bpub_date = DateField(allow_null=True, label='發布日期', required=False) # bread = IntegerField(label='閱讀量', max_value=2147483647, min_value=0, required=True) # bcomment = IntegerField(label='評論量', max_value=2147483647, min_value=0, required=True)4、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)@propertydef country_area(self):return self.country.area2.然后在定義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 = Animalfields = ('id', 'name', 'type','country','country_area')def get_country_area(self, obj):return obj.country.area幾點說明:
- SerializerMethodFiel是一個read-only字段
- 當不指定其method_name時,默認為get_<field_name>
- 如果使用ModelSerializer并指定字段時,要包含此時定義的字段
總結
以上是生活随笔為你收集整理的四、模型类序列化器ModelSerializer的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Arduino UNO DS3231高精
- 下一篇: AVRO讲解