模型序列化
from rest_framework import serializers
from meituan.models import Merchant,
class MerchantSerializer(serializers.ModelSerializer):
class Meta:
model = Merchant
# 要展示的字段列表,為“__all__”時(shí)則全部展示
fields = "__all__"
# 定義不展示哪些字段
# exclude = ['name']
序列化嵌套
- 使用場(chǎng)景
當(dāng)查詢的model里有外鍵時(shí),又想在取該model數(shù)據(jù)時(shí)將對(duì)應(yīng)的外鍵表中的數(shù)據(jù)同時(shí)取出時(shí)使用。
- 使用方法
定義序列化類時(shí),指定外鍵的字段使用哪個(gè)序列化類(因此,需要提前將外鍵表的序列化類寫(xiě)好)。
- read_only : 表示只有在查詢數(shù)據(jù)時(shí),才會(huì)使用到該字段的序列化類,在其他情況時(shí),不執(zhí)行該序列化類
- write_only : 表示只有在寫(xiě)的時(shí)候,才會(huì)執(zhí)行的序列化類。因?yàn)閛rm的外鍵在生成數(shù)據(jù)庫(kù)時(shí)會(huì)自動(dòng)創(chuàng)建成
filedname_id的形式,所以在指定寫(xiě)時(shí),應(yīng)該也指定成該形式。
- many :當(dāng)返回的是多條數(shù)據(jù)時(shí),需要指定
many=True 。確定取出的是單條數(shù)據(jù)時(shí),不用設(shè)置,因?yàn)槠淠J(rèn)為False 。
- 當(dāng)創(chuàng)建有外鍵數(shù)據(jù)的model數(shù)據(jù)時(shí),需要自己復(fù)寫(xiě)create方法。
class Merchant(models.Model):
"""
商家
"""
name = models.CharField(max_length=200,verbose_name='商家名稱',null=False)
address = models.CharField(max_length=200,verbose_name='商家',null=False)
logo = models.CharField(max_length=200,verbose_name='商家logo',null=False)
notice = models.CharField(max_length=200, verbose_name='商家的公告',null=True,blank=True)
up_send = models.DecimalField(verbose_name='起送價(jià)',default=0,max_digits=6,decimal_places=2)
lon = models.FloatField(verbose_name='經(jīng)度')
lat = models.FloatField(verbose_name='緯度')
created = models.ForeignKey(User,on_delete=models.SET_NULL,null=True)
class GoodsCategory(models.Model):
"""
商家商品分類
"""
name = models.CharField(max_length=20,verbose_name='分類名稱')
merchant = models.ForeignKey(Merchant,on_delete=models.CASCADE,verbose_name='所屬商家',related_name='categories')
from rest_framework import serializers
from meituan.models import Merchant,GoodsCategory,Goods
class MerchantSerializer(serializers.ModelSerializer):
class Meta:
model = Merchant
# 要展示的字段列表,為“__all__”時(shí)則全部展示
fields = "__all__"
# 定義不展示哪些字段
# exclude = ['name']
class GoodsSerializer(serializers.ModelSerializer):
class Meta:
model = Goods
fields = "__all__"
class GoodsCategorySerializer(serializers.ModelSerializer):
merchant = MerchantSerializer(read_only=True)
merchant_id = serializers.IntegerField(write_only=True)
goods_list = GoodsSerializer(many=True,read_only=True)
class Meta:
model = GoodsCategory
fields = "__all__"
def validate_merchant_id(self,value):
if not Merchant.objects.filter(pk=value).exists():
raise serializers.ValidationError("商家不存在!")
return value
def create(self,validated_data):
merchant_id = validated_data.get('merchant_id')
merchant = Merchant.objects.get(pk=merchant_id)
category = GoodsCategory.objects.create(**validated_data,merchant=merchant)
return category