序列化

  #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)

 

posted @ 2022-06-09 21:06  强仔必胜  阅读(23)  评论(0编辑  收藏  举报