1. 程式人生 > 實用技巧 >序列化(一)

序列化(一)

序列化的作用

  • 用來序列化資料。ORM->JSON
  • 用來驗證表單資料。Form
  • 可以建立資料,修改資料等。

Serializer的建構函式的引數:

  • instance:需要傳遞一個ORM物件,或者是一個queryset物件。用來將ORM模型序列化成JSON的
  • data:把需要驗證的資料傳給data,用來驗證這些資料是不是符合要求。
  • many:如果instance是一個queryset物件,那麼就需要設定為True,否則為False

自定義驗證、建立、修改資料

  • 複寫update、create方法。要在update方法中使用instance.save()進行儲存。
  • 通過重寫validate(self,attrs)方法進行驗證。attrs中包含了所有欄位。如果驗證不通過,那麼呼叫raise serializer.ValidationError('error')即可。
  • 當只針對單個欄位驗證時可以定義def validate_要驗證欄位的名(self,value)方法
class MerchantSerializer(serializers.Serializer):
    id = serializers.IntegerField(read_only=True)
    name = serializers.CharField(max_length=200,required=True,error_messages={"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 validate(self,attrs):
        raise serializer.ValidationError('驗證失敗')

    def validate_name(self,value):
        raise serializer.ValidationError('驗證失敗')

    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):
        return Merchant.objects.create(**validated_data)
from .serializers import MerchantSerializer,GoodsCategorySerializer
from django.http import JsonResponse
from django.views.decorators.http import require_http_methods
from meituan.models import Merchant,GoodsCategory,Goods
from rest_framework.response import Response

@require_http_methods(['GET','POST'])
def merchant(request):
    # get:返回所有的商家
    # post:建立新的商家
    if request.method == 'GET':
        queryset = Merchant.objects.all()
        serializer = MerchantSerializer(instance=queryset,many=True)
        return JsonResponse(serializer.data,status=200,safe=False)
    else:
        serializer = MerchantSerializer(data=request.POST)
        if serializer.is_valid():
            serializer.save()
            return JsonResponse(serializer.data, status=200)
        else:
            return JsonResponse(serializer.errors, status=400)

def category(request):
    if request.method == 'GET':
        queryset = GoodsCategory.objects.all()
        serializer = GoodsCategorySerializer(instance=queryset,many=True)
        return JsonResponse(serializer.data,safe=False)
    else:
        serializer = GoodsCategorySerializer(data=request.POST)
        if serializer.is_valid():
            serializer.save()
            return JsonResponse(serializer.data,status=200)
        else:
            return JsonResponse(serializer.errors, status=400)