如果我們想要使用序列化器對(duì)應(yīng)的是Django的模型類偎漫,DRF為我們提供了ModelSerializer模型類序列化器來(lái)幫助我們快速創(chuàng)建一個(gè)Serializer類澜建。
ModelSerializer與常規(guī)的Serializer相同清女,但提供了:
- 基于模型類自動(dòng)生成一系列字段
- 基于模型類自動(dòng)為Serializer生成validators独榴,比如unique_together
- 包含默認(rèn)的create()和update()的實(shí)現(xiàn)
一块饺、定義一個(gè)模型類序列化器
例如我們創(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 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='發(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)
image = ImageField(allow_null=True, label='圖片', max_length=100, required=False)
二、關(guān)于字段
1. 使用**fields**來(lái)明確字段朴沿,__all__表名包含所有字段猜谚,也可以寫明具體哪些字段败砂,例如:
class BookInfoSerializer(serializers.ModelSerializer):
"""圖書數(shù)據(jù)序列化器"""
class Meta:
model = BookInfo
fields = ('id', 'btitle', 'bpub_date')
2. 使用**exclude**可以明確排除掉哪些字段
class BookInfoSerializer(serializers.ModelSerializer):
"""圖書數(shù)據(jù)序列化器"""
class Meta:
model = BookInfo
exclude = ('image',)
3. 顯示指明字段,例如
class HeroInfoSerializer(serializers.ModelSerializer):
hbook = BookInfoSerializer()
class Meta:
model = HeroInfo
fields = ('id', 'hname', 'hgender', 'hcomment', 'hbook')
4. 指明只讀字段
可以通過(guò)**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')
三、添加額外參數(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)