• 序列化-序列化的嵌套


    1. class Merchant(models.Model):
    2. """
    3. 商家
    4. """
    5. name = models.CharField(max_length=200,verbose_name='商家名称',null=False)
    6. address = models.CharField(max_length=200,verbose_name='商家',null=False)
    7. logo = models.CharField(max_length=200,verbose_name='商家logo',null=False)
    8. notice = models.CharField(max_length=200, verbose_name='商家的公告',null=True,blank=True)
    9. up_send = models.DecimalField(verbose_name='起送价',default=0,max_digits=6,decimal_places=2)
    10. lon = models.FloatField(verbose_name='经度')
    11. lat = models.FloatField(verbose_name='纬度')
    12. create_time = models.DateTimeField(auto_now=True,null=True)
    13. class GoodsCategory(models.Model):
    14. """
    15. 商家商品分类
    16. """
    17. name = models.CharField(max_length=20,verbose_name='分类名称')
    18. merchant = models.ForeignKey(Merchant,on_delete=models.CASCADE,verbose_name='所属商家',related_name='categories')
    1. class GoodsCategorySerializer(serializers.ModelSerializer):
    2. class Meta:
    3. model = GoodsCategory
    4. fields = "__all__"

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

     嵌套

    1. class GoodsCategorySerializer(serializers.ModelSerializer):
    2. merchant = MerchantSerializer(read_only=True)
    3. class Meta:
    4. model = GoodsCategory
    5. fields = "__all__"

     post请求报错

    1. # 【DRF】序列化-序列化的嵌套
    2. class GoodsCategorySerializer(serializers.ModelSerializer):
    3. merchant = MerchantSerializer(read_only=True)
    4. merchant_id = serializers.IntegerField(write_only=True)
    5. class Meta:
    6. model = GoodsCategory
    7. fields = "__all__"
    8. # 验证商家id是否存在
    9. def validated_merchant_id(self,value):
    10. # 如果没有抛出异常
    11. if not Merchant.objects.filter(pk=value).exists():
    12. raise serializers.ValidationError("商家不存在")
    13. return value
    14. def create(self, validated_data):
    15. merchant_id = validated_data.get("merchant_id")
    16. merchant = Merchant.objects.get(pk=merchant_id)
    17. category = GoodsCategory.objects.create(**validated_data,merchant=merchant)
    18. return category

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

    1. {
    2. "id": 207,
    3. "merchant": {
    4. "id": 31,
    5. "name": "肯德基(花城店)",
    6. "address": "湖南省长沙市天心区花城路211号",
    7. "logo": "http://p1.meituan.net/xianfu/33c48a92a31a21e4bf32d3aa7c1c5c0d16649.jpg",
    8. "notice": "欢迎关林肯德基宅急送,专业外送,全程保温,准时送达!",
    9. "up_send": "0.00",
    10. "lon": 22.0,
    11. "lat": 22.0,
    12. "create_time": null
    13. },
    14. "goods_list": [
    15. {
    16. "id": 2011,
    17. "name": "百威啤酒T",
    18. "picture": "http://p1.meituan.net/xianfu/8fd48d2e154953ed306126e2a1eebeb159392.jpg",
    19. "intro": "主要原料:百威啤酒500毫升\r\n未成年人请勿饮酒,孕妇和身体不适者不宜饮酒。喝酒请勿驾车,请适度享用美酒,产品及包装以实物为准。",
    20. "price": "15.00",
    21. "category": 207
    22. }
    23. ],
    24. "name": "炸鸡啤酒"
    25. },
    1. class GoodsSerializer(serializers.ModelSerializer):
    2. class Meta:
    3. model = Goods
    4. fields = "__all__"
    5. # 【DRF】序列化-序列化的嵌套
    6. class GoodsCategorySerializer(serializers.ModelSerializer):
    7. merchant = MerchantSerializer(read_only=True)
    8. merchant_id = serializers.IntegerField(write_only=True)
    9. goods_list = GoodsSerializer(many=True,read_only=True)
    10. class Meta:
    11. model = GoodsCategory
    12. fields = "__all__"
    13. # 验证商家id是否存在
    14. def validated_merchant_id(self,value):
    15. # 如果没有抛出异常
    16. if not Merchant.objects.filter(pk=value).exists():
    17. raise serializers.ValidationError("商家不存在")
    18. return value
    19. def create(self, validated_data):
    20. merchant_id = validated_data.get("merchant_id")
    21. merchant = Merchant.objects.get(pk=merchant_id)
    22. category = GoodsCategory.objects.create(**validated_data,merchant=merchant)
    23. 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_字段名 对某个字段进行验证

    请求与响应

     

  • 相关阅读:
    停车系统源码
    Windows中的Git Bash运行conda命令:未找到命令的错误(已解决)
    简单个人静态HTML网页设计作品 基于HTML+CSS+JavaScript仿小米手机网站 html静态在线购物商城网页制作
    L85.linux命令每日一练 -- 第12章 Linux系统常用内置命令(一)
    androdi知识笔记
    有赞商城如何对接ERP、CRM系统?
    力扣leetcode算法-二分查找
    4. css资源加载 loader 解析器
    linux系统操作/基本命令/vim/权限修改/用户建立
    深度学习环境配置9——Ubuntu下的tensorflow-gpu==2.4.0环境配置
  • 原文地址:https://blog.csdn.net/weixin_38107457/article/details/126755283