如果我們想要使用序列化器對(duì)應(yīng)的是Django的模型類,DRF為我們提供了ModelSerializer模型類序列化器來幫助我們快速創(chuàng)建一個(gè)Serializer類桐腌。
ModelSerializer與常規(guī)的Serializer相同,但提供了:
- 基于模型類自動(dòng)生成一系列字段
- 基于模型類自動(dòng)為Serializer生成validators蚕苇,比如unique_together
- 包含默認(rèn)的create()和update()的實(shí)現(xiàn)
1 定義
比如我們創(chuàng)建一個(gè)BookInfoSerializer:
class BookInfoSerializer(serializers.ModelSerializer):
"""圖書數(shù)據(jù)序列化器"""
class Meta:
model = BookInfo
fields = '__all__'
- model 指明參照哪個(gè)模型類
- fields 指明為模型類的哪些字段生成
我們可以在python manage.py shell中查看自動(dòng)生成的BookInfoSerializer的具體實(shí)現(xiàn)
>>> from bookapp.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='發(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. 指定字段
- 使用fields來明確字段哩掺,all表名包含所有字段,也可以寫明具體哪些字段涩笤,如
class BookInfoSerializer(serializers.ModelSerializer):
"""圖書數(shù)據(jù)序列化器"""
class Meta:
model = BookInfo
fields = ('id', 'btitle', 'bpub_date')
- 使用exclude可以明確排除掉哪些字段
class BookInfoSerializer(serializers.ModelSerializer):
"""圖書數(shù)據(jù)序列化器"""
class Meta:
model = BookInfo
exclude = (id,)
- 顯示指明字段,如:
class HeroInfoSerializer(serializers.ModelSerializer):
hbook = BookInfoSerializer()
class Meta:
model = HeroInfo
fields = ('id', 'hname', 'hgender', 'hcomment', 'hbook')
- 指明只讀字段
可以通過read_only_fields指明只讀字段盒件,即僅用于序列化輸出的字段
class BookInfoSerializer(serializers.ModelSerializer):
"""圖書數(shù)據(jù)序列化器"""
class Meta:
model = BookInfo
fields = ('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ù)據(jù)序列化器"""
class Meta:
model = BookInfo
fields = ('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='發(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)