序列化器serializers的使用

serializer.py中设置序列化器

from rest_framework import serializers
from myapp.models import Poem

class PoemSerializer(serializers.Serializer):
    id = serializers.IntegerField(read_only=True)
    title = serializers.CharField(
        max_length=20
    )
    content = serializers.CharField(
        max_length=100
    )
    price = serializers.DecimalField(
        max_digits=8,
        decimal_places=2,
    )
    def update(self, instance, validated_data):
        instance.title = validated_data.get('title')
        instance.content = validated_data.get('content')
        instance.price = validated_data.get('price')
        instance.save()
        return instance

    def create(self, validated_data):
        poem = Poem.objects.create(**validated_data)
        return poem

Poem 表

class Poem(models.Model):
title = models.CharField(
    max_length=20,
    null=False,
)
content = models.CharField(
    max_length=100,
    null=True,
)
price = models.DecimalField(
    max_digits=8,
    decimal_places=2,
)

也就是说继承(serializers.Serializer)设计序列化器时序列化器中字段名要和model类中字段名一致

views视图函数 CBV

from django.http import JsonResponse, QueryDict
from django.shortcuts import render

from django.views import View
from .serializer import *
  
  class PoemOneApi(View):
        def get(self,req):
    params = req.GET
    id = int(params.get('id')) if params.get('id') else 0

    if id:
        poem = Poem.objects.get(pk=id)
        serializer = PoemSerializer(poem)
        return JsonResponse(serializer.data)

    poems = Poem.objects.all()
    serializer = PoemSerializer(poems,many=True)
    # 有多个序列化数据。要加上safe=False
    return JsonResponse(serializer.data,safe=False)

def post(self,req):
    params = req.POST
    serializer = PoemSerializer(data=params)

    if serializer.is_valid():
        serializer.save()
    return JsonResponse(serializer.data)

def put(self,req):
    params = QueryDict(req.body)

    id = params.get('id')
    poem = Poem.objects.get(pk=id)

    serializer = PoemSerializer(instance=poem,data=params)
    if serializer.is_valid():
        serializer.save()

    return JsonResponse(serializer.data)


def delete(self,req):
    params = QueryDict(req.body)
    id = params.get('id')
    poem = Poem.objects.get(pk=id)

    serializer = PoemSerializer(poem)

    poem.delete()

    return JsonResponse(serializer.data)

继承(serializers.Serializer)时 一定要重写 update 与 create 方法
在serializer.save()时会根据instance 有无 调用 update 或 create 方法
instance可认为是符合序列化结构的数据。
如果没有instance会调用 create 也就是添加Poem表数据
如果有instance 与data 则会更新数据

因为Serializer 继承 BaseSerializer类

def update(self, instance, validated_data):
raise NotImplementedError(’update() must be implemented.’)

def create(self, validated_data):
raise NotImplementedError(’create() must be implemented.’)

不重写直接调用则会raise。而期中save方法对create 与 update
有调用

if self.instance is not None:
    self.instance = self.update(self.instance, validated_data)
    assert self.instance is not None, (
        '`update()` did not return an object instance.'
    )
else:
    self.instance = self.create(validated_data)
    assert self.instance is not None, (
        '`create()` did not return an object instance.'
    )

return self.instance

如果觉得自定义序列化器的字段十分麻烦。可以继承serializers.ModelSerializer
只要内部定义Meta类指定model 模型 与 模型字段名即可

class PoemNewSerializer(serializers.ModelSerializer):

    class Meta:
        model = Poem
        fields = ['id','title','content','price']

ModelSerializer对models常用字段进行了映射。并且重写了 updata 与create方法使得我们可以直接调用save()方法而不用重写

serializer_field_mapping = {
    models.AutoField: IntegerField,
    models.BigIntegerField: IntegerField,
    models.BooleanField: BooleanField,
    models.CharField: CharField,
    models.CommaSeparatedIntegerField: CharField,
    models.DateField: DateField,
    models.DateTimeField: DateTimeField,
    models.DecimalField: DecimalField,
    models.EmailField: EmailField,
    models.Field: ModelField,
    models.FileField: FileField,
    models.FloatField: FloatField,
    models.ImageField: ImageField,
    models.IntegerField: IntegerField,
    models.NullBooleanField: NullBooleanField,
    models.PositiveIntegerField: IntegerField,
    models.PositiveSmallIntegerField: IntegerField,
    models.SlugField: SlugField,
    models.SmallIntegerField: IntegerField,
    models.TextField: CharField,
    models.TimeField: TimeField,
    models.URLField: URLField,
    models.GenericIPAddressField: IPAddressField,
    models.FilePathField: FilePathField,
}

视图函数中使用同继承Serializer一致

你可能感兴趣的:(Django,序列化器)