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一致