zoukankan      html  css  js  c++  java
  • DRF序列化小练习 03

    DRF 小练习

    """
    1、新建一个django项目,定义一个Car类,有name字符串属性,color整型选择属性(0:银色,1:黑色,2:红色,3:灰色),price全精度小数类型,image图片文件类型,brand字符串类型
    
    2、基于ModelSerializer类,完成Car资源的单查,群查,单增接口
    	序列化:显示车名,车的颜色,车的价格,车的海报,车的品牌
    	反序列化:必须提供车名,车的价格,车的品牌(车的匹配需要二次确认re_brand),车的颜色默认为银色(可以提供),车的海报不需要提供(默认为空)
    """
    
    
    
    # models.py
    class Car(models.Model):
        name = models.CharField(max_length=64)
        COLOR_CHOICES = (
            (0, '银色'),
            (1, '黑色'),
            (2, '白色'),
            (3, '红色'),
        )
        color = models.IntegerField(choices=COLOR_CHOICES, default=0)
        price = models.DecimalField(max_digits=8, decimal_places=2)
        img = models.ImageField(upload_to='img/', default='img/default.jpg')
        brand = models.CharField(max_length=64)
    
        # 自定义序列化字段
        @property
        def car_color(self):
            return self.get_color_display()
    
    
    # serializers.py
    class CarModelSerializer(serializers.ModelSerializer):
        # 自定义反序列化字段
        re_price = serializers.DecimalField(max_digits=8, decimal_places=2, write_only=True)
    
        class Meta:
            # 绑定类
            model = models.Car
            # 参与序列化与反序列化的字段
            fields = ['name', 'car_color', 'price', 'img', 'brand', 'color', 're_price']
            extra_kwargs = {
                'img': {
                    'read_only': True
                },
                'color': {
                    'write_only': True
                }
            }
    
        # 全局钩子
        def validate(self, attrs):
            price = attrs.get('price')
            re_price = attrs.pop('re_price')
            if not price == re_price:
                raise serializers.ValidationError({'re_price': '价格不一致!'})
            return attrs
    
    # views.py
    class CarAPIView(APIView):
        def get(self, request, *args, **kwargs):
            pk = kwargs.get('pk')
            # 单查
            if pk:
                car_obj = models.Car.objects.filter(pk=pk).first()
                if not car_obj:
                    return Response({
                        'status': 1,
                        'msg': 'pk error'
                    }, status=400)
                serializer_obj = serializers.CarModelSerializer(car_obj)
    
                return Response({
                    'status': 0,
                    'msg': 'ok',
                    'results': serializer_obj.data
                })
            # 群查
            car_query = models.Car.objects.all()
            serializer_obj = serializers.CarModelSerializer(car_query, many=True)
            return Response({
                'status': 0,
                'msg': 'ok',
                'results': serializer_obj.data
            })
    
        def post(self, request, *args, **kwargs):
            # 单增
            serializer_obj = serializers.CarModelSerializer(data=request.data)
            # 校验不通过会自动将错误信息返回给前端
            serializer_obj.is_valid(raise_exception=True)
            car_obj = serializer_obj.save()
    
            return Response({
                'status': 0,
                'msg': 'ok',
                'results': serializers.CarModelSerializer(car_obj).data
            })
    
  • 相关阅读:
    Ado.Net基础拾遗一:读取数据
    Linq 简明教程
    ASP.NET MVC DropdownList的使用
    inner join, left join ,right join 结果
    C#基础之 派生类
    SQL Server 笔试题总结
    SQL Server 基础 之 CASE 子句
    昨晚京东校招笔试,没考一道.net,全考java了
    利用scrapy和MongoDB来开发一个爬虫
    linux 获取网卡的IP地址
  • 原文地址:https://www.cnblogs.com/bigb/p/12102470.html
Copyright © 2011-2022 走看看