• 序列化


      #1.用来序列化数据。ORM-JSON

      #2.用来验证表单数据。Form

      #3.可以创建数据,修改数据等

      

    Serializer的构造函数的两个参数:
       #1.instance 需要传递一个ORM对象,或者是一个queryset对象,用来将orm模型序列化成JSON的。
       #2.data    把需要验证的数据传递给data,用来验证这些数据是不是符合要求。
    #3.many 如果instance是一个queryset对象,那么many=True
    class MerchantSerializer(serializers.Serializer):
        id serializers.IntegerField(read_only=True)
        name serializers.CharField(max_length=200,required=True,error_message={"required":"name为必须传的参数"})
        logo serializers.CharField(max_length=200,required=True)
        address serializers.CharField(max_length=200,required=True)
        notice serializers.CharField(max_length=200,required=False)
        up_send serializers.DecimalField(required=False,max_digits=6,decimal_places=2)
        lon serializers.FloatField(required=True)
        lat serializers.FloatField(required=True)
        
    def update(self,instance,validated_data):
        instance.name validated_data.get('name',instance.name)
        instance.logo validated_data.get('logo',instance.logo)
        instance.address validated_data.get('address',instance.address)
        instance.notice validated_data.get('notice',instance.notice)
        instance.up_send validated_data.get('up_send',instance.up_send)
        instance.lon validated_data.get('lon',instance.lon)
        instance.lat validated_data.get('lat',instance.lat)
        instance.save()
        return instance
    def create(self,validated_data):
     #**可以把{"name":"zhangsan"}改成name=zhangsan的形式
    return Merchant.objects.create**validated_data)
    views.py:

    from
    .models import Merchant from .serializers import MerchantSerializer from django.http.response import JsonResponse from django.views.decorators.http import require_http_methods @require_http_methods(['GET','POST']) def merchant(request): if request.method == 'GET': merchants = Merchant.objects.all() serializer = MerchantSerializer(merchants,many=True) return JsonResponse(serializer.data,safe=False) else: serializer = MerchantSerializer(data=request.POST) if serializer.is_valid(): serializer.save() return JsonResponse(serializer.data,status=200) return JsonResponse(serializer.errors,status=400)
    from django.urls import path
    from .views import merchant
    
    GET、POST请求均可以
    urlpatterns=[
    path('/merchant/',merchant,name="merchant")
    ]

     序列化嵌套

    有时候在一个序列化中,我们可能需要其他模型的序列化。这时候就可以使用到序列化的嵌套。比如我们在GoodsCategory中想要获取Merchant以及这个分类下的商品Goods(只是为了演示,实际情况不一定要全部返回)。那么示例代码如下
    class GoodsSerializer(serializers.ModelSerializer):
        class Meta:
            model = Goods
            fields = "__all__"
    
    class MerchantSerializer(serializers.ModelSerializer):
        class Meta:
            model = Merchant
            fields = "__all__"
    
    class GoodsCategorySerializer(serializers.ModelSerializer):
        merchant = MerchantSerializer(read_only=True,required=False)
        goods_list = GoodsSerializer(many=True,required=False)
        merchant_id = serializers.IntegerField(required=True,write_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(name=validated_data.get('name'), merchant=merchant)
            return category
    @require_http_methods(['GET','POST'])
    def goods_category(request):
        if request.method == 'GET':
            categories = GoodsCategory.objects.all()
            serializer = GoodsCategorySerializer(categories,many=True)
            return JsonResponse(serializer.data,safe=False)
        else:
            serializer = GoodsCategorySerializer(data=request.POST)
            if serializer.is_valid():
                serializer.save()
                return JsonResponse(serializer.data)
            else:
                return JsonResponse(serializer.errors,status=400)
    继承generics.GenericAPIView之后视图里就可以
    
      queryset = Api.objects.all()
        serializer_class = ApiSerializer
    from rest_framework.decorators import action
    
    class MerchantViewSet(viewsets.ModelViewSet):
        queryset = Merchant.objects.all()
        serializer_class = MerchantSerializer
    
        detail是指的是id,False是不指定
        @action(['GET'],detail=False)
        def cs(self,request,*args,**kwargs):
            queryset = self.get_queryset()
            queryset = queryset.filter(name__contains="长沙")
            serializer = MerchantSerializer(queryset,many=True)
            return Response(serializer.data)
  • 相关阅读:
    c#读取INI文件
    无题
    tnsping 命令解析
    宁静——一种心灵的奢望
    .NET框架类别
    19任意三个数的和为15
    VS.NET2005安装过程中遇到error:1935错误时的解决方法
    SQL Server 2005 : 存储过程传递字符串类型参数时,如何在参数中包含单引号
    SQL Server 2005 : 分割字符串
    网站发布在中文操作系统,但ReportViewer的工具栏显示为英文的解决方法
  • 原文地址:https://www.cnblogs.com/wanghuaqiang/p/16361175.html
Copyright © 2020-2023  润新知