• 序列化(模型序列化、序列化嵌套)


    模型序列化

    from rest_framework import serializers
    from meituan.models import Merchant,
    
    class MerchantSerializer(serializers.ModelSerializer):
        class Meta:
            model = Merchant
            # 要展示的字段列表,为“__all__”时则全部展示
            fields = "__all__"
            # 定义不展示哪些字段
            # exclude = ['name']
    

    序列化嵌套

    • 使用场景
      当查询的model里有外键时,又想在取该model数据时将对应的外键表中的数据同时取出时使用。
    • 使用方法
      定义序列化类时,指定外键的字段使用哪个序列化类(因此,需要提前将外键表的序列化类写好)。
      • read_only : 表示只有在查询数据时,才会使用到该字段的序列化类,在其他情况时,不执行该序列化类
      • write_only : 表示只有在写的时候,才会执行的序列化类。因为orm的外键在生成数据库时会自动创建成filedname_id的形式,所以在指定写时,应该也指定成该形式。
      • many :当返回的是多条数据时,需要指定 many=True 。确定取出的是单条数据时,不用设置,因为其默认为False
      • 当创建有外键数据的model数据时,需要自己复写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='起送价',default=0,max_digits=6,decimal_places=2)
        lon = models.FloatField(verbose_name='经度')
        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__”时则全部展示
            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
    
  • 相关阅读:
    中国开源现状如何?
    程序员怎么升职?
    如何从挫败感到成就感,身为程序员每天都在经历这些!
    现实版“无间道”,4名煞星潜伏,只为拖库!
    想想当初为什么做程序员!
    做程序员累的时候想想这个!
    别人问我:为什么程序员都不善言辞?惭愧啊!
    程序员被沦陷!国内程序员真的饱和了?
    JS和JSP的区别?
    web.xml配置WebApplicationContext的两种方法
  • 原文地址:https://www.cnblogs.com/xshan/p/14193325.html
Copyright © 2020-2023  润新知