serializer序列化组件
一、models准备
from django.db import models
class Book(models.Model):
nid = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
price = models.DecimalField(max_digits=5, decimal_places=2)
publish_date = models.DateField(null=True)
xx = models.IntegerField(choices=((0, '文学类'), (1, '情感类')), default=1, null=True)
publish = models.ForeignKey(to='Publish', to_field='nid', on_delete=models.CASCADE, null=True)
authors = models.ManyToManyField(to='Author')
def __str__(self):
return self.name
def xxx(self):
return '123xxx'
class Author(models.Model):
nid = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
age = models.IntegerField()
def __str__(self):
return self.name
class Publish(models.Model):
nid = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
city = models.CharField(max_length=32)
email = models.EmailField()
def __str__(self):
return self.name
def xx2(self):
return 'abc123'
二、序列化的两种方法:
2.1 Serializer
from rest_framework import serializers
from app01 import models
class BookSerializer(serializers.Serializer):
name = serializers.CharField()
price = serializers.CharField()
publish = serializers.CharField(source='publish.name')
func_con = serializers.CharField(source='xxx')
func_con2 = serializers.CharField(source='publish.xx2')
book_type = serializers.CharField(source='get_xx_display', read_only=True)
publish_detail = serializers.SerializerMethodField(read_only=True)
def get_publish_detail(self, obj):
print(type(obj))
return {'name': obj.publish.name, 'city': obj.publish.city}
authors = serializers.SerializerMethodField(read_only=True)
def get_authors(self, obj):
authorser = AuthorSerializer(obj.authors.all(), many=True)
return authorser.data
from app01 import models
from app01.app01serializer import BookSerializer
from rest_framework.views import APIView
from rest_framework.response import Response
class Book(APIView):
def get(self, request, *args, **kwargs):
response = {'code': 100, 'msg': '查询成功!'}
books = models.Book.objects.all()
booker = BookSerializer(instance=books, many=True)
print(type(booker.data))
response['data'] = booker.data
return Response(response)
def post(self, request):
booker = BookSerializer(data=request.data)
if booker.is_valid(raise_exception=True):
booker.create(booker.validated_data)
return Response()
2.2 ModelSerializer
from rest_framework import serializers
from app01 import models
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = models.Book
fields = '__all__'
depth = 1
"""
xx = serializers.CharField(source='get_xx_display')
authors = serializers.SerializerMethodField()
def get_authors(self, obj):
ret = AuthorSerializer(instance=obj.authors.all(), many=True)
return ret.data
"""
def post(self,request):
bookser=BookSerializer(data=request.data)
if bookser.is_valid(raise_exception=True):
bookser.save()
else:
print(bookser.errors['name'][0])
return Response()