序列化-序列化的嵌套

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 = GoodsCategory
        fields = "__all__"

http://127.0.0.1:8000/serializerapp/category/

 嵌套

class GoodsCategorySerializer(serializers.ModelSerializer):
    merchant = MerchantSerializer(read_only=True)
    class Meta:
        model = GoodsCategory
        fields = "__all__"

 post请求报错

# 【DRF】序列化-序列化的嵌套
class GoodsCategorySerializer(serializers.ModelSerializer):
    merchant = MerchantSerializer(read_only=True)
    merchant_id = serializers.IntegerField(write_only=True)
    class Meta:
        model = GoodsCategory
        fields = "__all__"
    # 验证商家id是否存在
    def validated_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

 获取分类“酒” 各类酒商品

{
        "id": 207,
        "merchant": {
            "id": 31,
            "name": "肯德基(花城店)",
            "address": "湖南省长沙市天心区花城路211号",
            "logo": "http://p1.meituan.net/xianfu/33c48a92a31a21e4bf32d3aa7c1c5c0d16649.jpg",
            "notice": "欢迎关林肯德基宅急送,专业外送,全程保温,准时送达!",
            "up_send": "0.00",
            "lon": 22.0,
            "lat": 22.0,
            "create_time": null
        },
        "goods_list": [
            {
                "id": 2011,
                "name": "百威啤酒T",
                "picture": "http://p1.meituan.net/xianfu/8fd48d2e154953ed306126e2a1eebeb159392.jpg",
                "intro": "主要原料:百威啤酒500毫升\r\n未成年人请勿饮酒,孕妇和身体不适者不宜饮酒。喝酒请勿驾车,请适度享用美酒,产品及包装以实物为准。",
                "price": "15.00",
                "category": 207
            }
        ],
        "name": "炸鸡啤酒"
    },
class GoodsSerializer(serializers.ModelSerializer):
    class Meta:
        model = Goods
        fields = "__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 = GoodsCategory
        fields = "__all__"
    # 验证商家id是否存在
    def validated_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

关于read_only 和write_only 

read_only 这个字段只能读,只有返回返回数据的时候会使用

write_only=True 这个字段只能被写,只有在新增数据或者更新数据的时候被调用

验证:

1.验证在Field 中通过参数的形式进行指定,比如required等

2.通过重写validate(self,attrs) 方法 进行验证,attrs中包含所有字段,如果验证不通过,那么调用rasie serializer.ValidationError('error')

3.重写validate_字段名 对某个字段进行验证

请求与响应

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值