日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

四、模型类序列化器ModelSerializer

發布時間:2024/1/1 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 四、模型类序列化器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.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 = 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。