• drf序列化与反序列化作业1


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

    代码

    #urls
    
    from django.conf.urls import url,include
    from django.contrib import admin
    from django.conf import settings
    from django.views.static import serve
    
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^api/',include('api.urls')),
        url(r'^media/(?P<path>.*)',serve,{'document_root':settings.MEDIA_ROOT})
    ]
    
    
    #view
    from django.shortcuts import render
    
    # Create your views here.
    from rest_framework.views import APIView
    from rest_framework.response import Response
    from . import models,serializers
    
    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'
                    })
                car_ser = serializers.CarModelSerializer(car_obj)
                return Response({
                    'status':0,
                    'msg':'ok',
                    'results':car_ser.data
                })
    
            car_query = models.Car.objects.all()
            car_ser = serializers.CarModelSerializer(car_query,many=True)
            return Response({
                'status':0,
                'msg':'ok',
                'results':car_ser.data
            })
    
        def post(self,request,*args,**kwargs):
            car_ser = serializers.CarModelSerializer(data=request.data)
    
            #校验不通过会自动抛出异常,代码不会继续往下执行
            car_ser.is_valid(raise_exception=True)
            car_obj = car_ser.save()
            return Response({
                'status':0,
                'msg':'ok',
                'results':serializers.CarModelSerializer(car_obj).data
            })
    
    
    #model
    from django.db import models
    
    # Create your models here.
    
    class Car(models.Model):
        COLOR_CHOICES = [(0,'银色'),(1,'黑色'),(2,'红色'),(3,'灰色')]
        name = models.CharField(max_length=64)
        colors = models.IntegerField(choices=COLOR_CHOICES,default=0)
        price = models.DecimalField(max_digits=10,decimal_places=2)
        brand = models.CharField(max_length=64)
        image = models.ImageField(upload_to='img',default='img/default.png')
    
        @property
        def car_color(self):
            return self.get_colors_display()
    
    
    
    #serializers
    from rest_framework import serializers
    from . import models
    
    class CarModelSerializer(serializers.ModelSerializer):
        re_brand = serializers.CharField(write_only=True)
        class Meta:
            model = models.Car
            #指向序列化反序列化的models类
            fields = ['name','price','color','car_color','image','brand','re_brand']
            extra_kwargs = {
                'image':{
                    'read_only':True
                },
                'color':{
                    'write_only':True
                }
            }
    
            def validate(self,attrs):
                brand = attrs.get('brand')
                re_brand = attrs.pop('re_brand')
                if brand != re_brand:
                    raise serializers.ValidationError({'re_brand':'品牌输入不正确'})
                return attrs
    
  • 相关阅读:
    js 的防抖与节流
    Vue---图形二维码、rules校验规则、el-dialog展示图片
    vue ----弹框
    vue的背景加载--旋转*号
    利用ES6新特性将时间戳转换为yyyy-mm-dd格式
    路由守卫之离开守卫
    Java的运行环境与开发环境
    list<map<string,object>> 按照某字段排序
    没有CSRF保护的HTML表单 漏洞解决办法
    通过mybatis-plus的分页插件,实现分页
  • 原文地址:https://www.cnblogs.com/ghylpb/p/12103945.html
Copyright © 2020-2023  润新知