• 序列化练习


    drf 序列化练习:

    练习:

    
    1.、新建一个django项目,定义一个Car类,有name字符串属性,color整型选择属性(0:银色,1:黑色,2:红色,3:灰色),price全精度小数类型,image图片文件类型,brand字符串类型
    
    2、基于ModelSerializer类,完成Car资源的单查,群查,单增接口
    	序列化:显示车名,车的颜色,车的价格,车的海报,车的品牌
    	反序列化:必须提供车名,车的价格,车的品牌(车的匹配需要二次确认re_brand),车的颜色默认为银色(可以提供),车的海报不需要提供(默认为空)
    """
    
    

    models.py

    from django.db import models
    
    class Car(models.Model):
    	COLOR_CHOICE = {
            (0,'银色'),
            (1,'黑色'),
            (2,'红色'),
            (3,'灰色'),
        }
        name = models.CharField(max_length=64,verbose_name='车名',blank=True,unique=True )
    	price = models.DecimaField(max_digits=10,min_digits=2,verbose_name='价格')
    	img = models.ImageField(upload_to='img',default='img/default.png',verbose_name='海报')
    	color = models.IntegerField(choices=SEX_CHOICES,default=0,verbose_name='样式')
    	brand = models.CharField(max_length=8,verbose_name='品牌')
    	id_delete = models.BooleanField(default=False,verbose_name='是否注销')
        create_time = models.DateTimeField(auto_now_add=True,verbose_name='注册时间')
    	
    class Meta:
        db_table = 'owen_car'
        verbose_name_plural = 'c车'
    def __str__(self):
        return self.username
    @property 
    def color(self):
        return self.get_color_display()
    @property
    def icon(self):
        from django.conf import settings
        return '%s%s%s' % (settings.BASE_URL, settings.MEDIA_URL, self.img)
    

    #views.py

    from django.conf import settings
    from rest_framework.views import APIView
    from rest_framework.response import  Response
    from . import models
    from . import serializers 
    
    class CarView(APIView):
        
        def get(self, request, *args, **kwargs):
            pk = kwargs.get('pk')
            if pk:     # 单查
                user_obj = models.User.objects.filter(is_delete=False, pk=pk).first()
                if not user_obj:
                    return Response({
                        'status': 1,
                        'msg': 'pk error',
                    }, status=400)
                user_ser = serializers.Car_drf(user_obj,many=False)
                return Response({
                    'status': 0,
                    'msg': 'ok',
                    'results': user_ser.data
                })
            else:    #群查
                user_query = models.User.objects.filter(is_delete=False).all()
                user_ser = serializers.Car_drf(user_query, many=True)
    
                return Response({
                    'status': 0,
                    'msg': 'ok',
                    'results': user_ser.data
                })
    	
            
           #单增
    	def post(self, request, *args, **kwargs):
            user_ser = serializers.Car_drf(data=request.data)
            if user_ser.is_valid():
                # 入库
                user_obj = user_ser.save()
                return Response({
                    'status': 0,
                    'msg': 'ok',
                    'results': serializers.Car_drf(user_obj).data
                })
            else:
                return Response({
                    'status': 1,
                    'msg': user_ser.errors,
                })
    	
    

    #serializers.py

    from rest_framework import serializers
    from django.conf import settings
    from . import models
    
    class Car_drf(serializers.ModelSerializer):
        
        re_brand = serializers.CharField(max_length=8,verbose_name='品牌',write_only=True)
        class Meta:
            model = models.Car
    	    fields = ('name','color','brand','icon','price','')
    		extra_kwargs = { 
             'name'{: 'max_length': 10, 'error_messages': {'max_length': '太长'}},
    		'color': {'read_only':True},
           }
       def validate_username(self, value):
            if 'x' in value.lower():
                raise serializers.ValidationError('名字中不能有x')
    		return value	
       def validate(self,attrs):
            brand =attrs.get('brand')
            re_brand = attrs.pop('re_brand')
            if brand !=re_brand:
                raise serializers.ValidationError({'re_password': '两次品牌选择不一致'})
    |	return attrs
                
    		
             
    
  • 相关阅读:
    搭建strom 的开发环境
    maven 的plugin 的使用
    Maven 的dependency 的 classifier的作用
    Maven中的dependency的scope作用域详解
    Supervisor-进程监控自动重启
    websocket 实战
    vue 监听路由变化
    vux-uploader 图片上传组件
    vue 定义全局函数
    判断对象属性的值是否空,如为空,删除该属性
  • 原文地址:https://www.cnblogs.com/shaozheng/p/12099214.html
Copyright © 2020-2023  润新知