zoukankan      html  css  js  c++  java
  • 基于ModelSerializer类

    '''
    新建一个django项目,定义一个Car类,有name字符串属性,color整型选择属性(0:银色,1:黑色,2:红色,3:灰色),price全精度小数类型,image图片文件类型,brand字符串类型
    
    基于ModelSerializer类,完成Car资源的单查,群查,单增接口
        序列化:显示车名,车的颜色,车的价格,车的海报,车的品牌
        反序列化:必须提供车名,车的价格,车的品牌(车的匹配需要二次确认re_brand),车的颜色默认为银色(可以提供),车的海报不需要提供(默认为空)
    '''
    # serializers.py
    from rest_framework import exceptions,serializers
    from django.conf import settings
    from api import models
    
    class CarSerializer(serializers.Serializer):
        name = serializers.CharField()
        price = serializers.DecimalField(max_digits=8,decimal_places=2)
        brand = serializers.CharField()
    
        color = serializers.SerializerMethodField()
        def get_color(self,obj):
            return obj.get_color_display()
    
        img = serializers.SerializerMethodField()
        def get_img(self,obj):
            return f"http://127.0.0.1:8000{settings.MEDIA_URL}{str(obj.image)}"
    
    
    
    class CarDeSerializer(serializers.Serializer):
        name = serializers.CharField()
        color = serializers.IntegerField(required=False)
        price = serializers.DecimalField(max_digits=8, decimal_places=2,required=True)
        img = serializers.ImageField(required=False)
        brand = serializers.CharField(required=True)
        re_brand = serializers.CharField(required=True)
    
        def validate(self, attrs):
            brand = attrs.get('brand')
            re_brand = attrs.pop('re_brand')
            if brand != re_brand:
                raise exceptions.ValidationError('两次品牌不一致')
            return attrs
    
        def create(self, validated_data):
            return models.Car.objects.create(**validated_data)
    # views.py
    from django.shortcuts import render
    from rest_framework.views import APIView
    from rest_framework.response import Response
    from . import models,serializers
    
    
        def post(self, request, *args, **kwargs):
            if not isinstance(request.data, dict) or request.data == {}:
                return Response({
                    'status': 0,
                    'msg': '数据异常',
                })
    
            car_dser = serializers.CarDeSerializer(data=request.data)
            if car_dser.is_valid():
                car_obj = car_dser.save()
                return Response({
                    'status': 0,
                    'msg':'ok',
                    'results':serializers.CarSerializer(car_obj).data
                })
            else:
                return Response({
                    'status': 0,
                    'msg': 'ok',
                    'results':car_dser.errors
                })
    # api.urls.py
    from django.conf.urls import url,include
    from django.contrib import admin
    from django.views.static import serve
    from django.conf import settings
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^api/',include('api.urls')),
        url(r'^media/(?P<path>.*)',serve,{"document_root":settings.MEDIA_ROOT})
    
    ]
    
  • 相关阅读:
    2.12 使用@DataProvider
    2.11 webdriver中使用 FileUtils ()
    Xcode8 添加PCH文件
    The app icon set "AppIcon" has an unassigned child告警
    Launch Image
    iOS App图标和启动画面尺寸
    iPhone屏幕尺寸、分辨率及适配
    Xcode下载失败 使用已购项目页面再试一次
    could not find developer disk image
    NSDate与 NSString 、long long类型的相互转化
  • 原文地址:https://www.cnblogs.com/samoo/p/12120725.html
Copyright © 2011-2022 走看看