序列化(一)
阿新 • • 發佈:2020-12-26
序列化的作用
- 用來序列化資料。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)