四、模型类序列化器ModelSerializer
如果我們想要使用序列化器對(duì)應(yīng)的是Django的模型類(lèi),DRF為我們提供了ModelSerializer模型類(lèi)序列化器來(lái)幫助我們快速創(chuàng)建一個(gè)Serializer類(lèi)。
ModelSerializer與常規(guī)的Serializer相同,但提供了:
- 基于模型類(lèi)自動(dòng)生成一系列字段
- 包含默認(rèn)的create()和update()的實(shí)現(xiàn)
1、 定義
比如我們創(chuàng)建一個(gè)BookInfoSerializer
class BookInfoSerializer(serializers.ModelSerializer):"""圖書(shū)數(shù)據(jù)序列化器"""class Meta:model = BookInfofields = '__all__'model 指明參照哪個(gè)模型類(lèi)
fields 指明為模型類(lèi)的哪些字段生成
我們可以在python manage.py shell中查看自動(dòng)生成的BookInfoSerializer的具體實(shí)現(xiàn)
>>> from booktest.serializers import BookInfoSerializer >>> serializer = BookInfoSerializer() >>> serializer BookInfoSerializer():id = IntegerField(label='ID', read_only=True)btitle = CharField(label='名稱(chēng)', max_length=20)bpub_date = DateField(allow_null=True, label='發(fā)布日期', required=False)bread = IntegerField(label='閱讀量', max_value=2147483647, min_value=-2147483648, required=False)bcomment = IntegerField(label='評(píng)論量', max_value=2147483647, min_value=-2147483648, required=False)2、指定字段
1)使用fields來(lái)明確字段,__all__表名包含所有字段,也可以寫(xiě)明具體哪些字段,如
class BookInfoSerializer(serializers.ModelSerializer):"""圖書(shū)數(shù)據(jù)序列化器"""class Meta:model = BookInfofields = ('id', 'btitle', 'bpub_date')2)使用exclude可以明確排除掉哪些字段
class BookInfoSerializer(serializers.ModelSerializer):"""圖書(shū)數(shù)據(jù)序列化器"""class Meta:model = BookInfoexclude = ('image',)3)顯示指明字段,如:
class HeroInfoSerializer(serializers.ModelSerializer):hbook = BookInfoSerializer()class Meta:model = HeroInfofields = ('id', 'hname', 'hgender', 'hcomment', 'hbook')4)指明只讀字段
可以通過(guò)read_only_fields指明只讀字段,即僅用于序列化輸出的字段
class BookInfoSerializer(serializers.ModelSerializer):"""圖書(shū)數(shù)據(jù)序列化器"""class Meta:model = BookInfofields = ('id', 'btitle', 'bpub_date', 'bread', 'bcomment')read_only_fields = ('id', 'bread', 'bcomment')3、添加額外參數(shù)
我們可以使用extra_kwargs參數(shù)為ModelSerializer添加或修改原有的選項(xiàng)參數(shù)
class BookInfoSerializer(serializers.ModelSerializer):"""圖書(shū)數(shù)據(jù)序列化器"""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='名稱(chēng)', max_length=20) # bpub_date = DateField(allow_null=True, label='發(fā)布日期', required=False) # bread = IntegerField(label='閱讀量', max_value=2147483647, min_value=0, required=True) # bcomment = IntegerField(label='評(píng)論量', max_value=2147483647, min_value=0, required=True)4、django restframework serializer 增加自定義字段
在使用django restframework serializer 序列化在django中定義的model時(shí),有時(shí)候我們需要額外在serializer中增加一些model中沒(méi)有的字段。有兩種方法實(shí)現(xiàn)這個(gè)目的。
假設(shè)現(xiàn)在有一個(gè)Animal模型,其中有name, type, country字段,country為外鍵。我們?cè)谛蛄谢疉nimal時(shí),需要額外增加外鍵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時(shí),使用字段的source參數(shù)指向我們上面定義好的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幾點(diǎn)說(shuō)明:
- SerializerMethodFiel是一個(gè)read-only字段
- 當(dāng)不指定其method_name時(shí),默認(rèn)為get_<field_name>
- 如果使用ModelSerializer并指定字段時(shí),要包含此時(shí)定義的字段
總結(jié)
以上是生活随笔為你收集整理的四、模型类序列化器ModelSerializer的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Arduino UNO DS3231高精
- 下一篇: AVRO讲解