admin管理员组文章数量:1794759
序列化
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='起送价',default=0,max_digits=6,decimal_places=2)lon = models.FloatField(verbose_name='经度')lat = models.FloatField(verbose_name='纬度')create_time = models.DateTimeField(auto_now=True,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')
class GoodsCategorySerializer(serializers.ModelSerializer):class Meta:model = GoodsCategoryfields = "__all__"
http://127.0.0.1:8000/serializerapp/category/
嵌套
class GoodsCategorySerializer(serializers.ModelSerializer):merchant = MerchantSerializer(read_only=True)class Meta:model = GoodsCategoryfields = "__all__"
post请求报错
# 【DRF】序列化-序列化的嵌套
class GoodsCategorySerializer(serializers.ModelSerializer):merchant = MerchantSerializer(read_only=True)merchant_id = serializers.IntegerField(write_only=True)class Meta:model = GoodsCategoryfields = "__all__"# 验证商家id是否存在def validated_merchant_id(self,value):# 如果没有抛出异常if not Merchant.objects.filter(pk=value).exists():raise serializers.ValidationError("商家不存在")return valuedef 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
获取分类“酒” 各类酒商品
{"id": 207,"merchant": {"id": 31,"name": "肯德基(花城店)","address": "湖南省长沙市天心区花城路211号","logo": ".jpg","notice": "欢迎关林肯德基宅急送,专业外送,全程保温,准时送达!","up_send": "0.00","lon": 22.0,"lat": 22.0,"create_time": null},"goods_list": [{"id": 2011,"name": "百威啤酒T","picture": ".jpg","intro": "主要原料:百威啤酒500毫升\r\n未成年人请勿饮酒,孕妇和身体不适者不宜饮酒。喝酒请勿驾车,请适度享用美酒,产品及包装以实物为准。","price": "15.00","category": 207}],"name": "炸鸡啤酒"},
class GoodsSerializer(serializers.ModelSerializer):class Meta:model = Goodsfields = "__all__"# 【DRF】序列化-序列化的嵌套
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 = GoodsCategoryfields = "__all__"# 验证商家id是否存在def validated_merchant_id(self,value):# 如果没有抛出异常if not Merchant.objects.filter(pk=value).exists():raise serializers.ValidationError("商家不存在")return valuedef 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
关于read_only 和write_only
read_only 这个字段只能读,只有返回返回数据的时候会使用
write_only=True 这个字段只能被写,只有在新增数据或者更新数据的时候被调用
验证:
1.验证在Field 中通过参数的形式进行指定,比如required等
2.通过重写validate(self,attrs) 方法 进行验证,attrs中包含所有字段,如果验证不通过,那么调用rasie serializer.ValidationError('error')
3.重写validate_字段名 对某个字段进行验证
请求与响应
本文标签: 序列化
版权声明:本文标题:序列化 内容由林淑君副主任自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.xiehuijuan.com/baike/1695505719a312742.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论