第一种
models.py
class Book_new_Table(models.Model):
book_name = models.CharField(max_length=20,verbose_name="书籍名称")
class Meta:
db_table = "book_new_table"
verbose_name = "书籍表"
verbose_name_plural = verbose_name
def __str__(self):
return self.book_name
class People_new_table(models.Model):
# 定义一个有序字典
SEX_CHOICE = (
(1, "男"),
(2, "女")
)
people_name = models.CharField(max_length=20,verbose_name="任务名称")
people_info = models.CharField(max_length=20,verbose_name="人物描述")
gender = models.SmallIntegerField(choices=SEX_CHOICE,verbose_name="性别")
book = models.ForeignKey(Book_new_Table,on_delete=models.CASCADE) #不添加related_name,反向查询语句为
class Meta:
db_table = "people_new_table"
verbose_name = "人物表"
verbose_name_plural = verbose_name
def __str__(self):
return self.people_name
serializser.py
from rest_framework import serializers
class BookSerializer(serializers.Serializer):
id = serializers.IntegerField()
book_name = serializers.CharField()
class PeopleSerializer(serializers.Serializer):
id = serializers.IntegerField()
people_name = serializers.CharField()
people_info = serializers.CharField()
gender = serializers.CharField()
#如果我们定义的序列化器外键字段类型为:IntegerField那么,我们定义的序列化器字段名必须和数
##据库种的外键字段名一致
book_id = serializers.IntegerField()
view.py
from book.serializers import BookSerializer,PeopleSerializer
def Book_serializer(request):
bookinfo = Book_new_Table.objects.get(id=1)
ser = BookSerializer(instance=bookinfo) #序列化多条数据,就加上(instance=bookinfo,many=True)
print(ser,type(ser))
return JsonResponse(data=ser.data)
def People_serializer(request):
peopleinfo = People_new_table.objects.get(id=1)
ser = PeopleSerializer(instance=peopleinfo)
return JsonResponse(ser.data)
第二种外键序列化器的使用
serializer.py
from book.models import Book_new_Table
class PeopleSerializer_2(serializers.Serializer):
id = serializers.IntegerField()
people_name = serializers.CharField()
people_info = serializers.CharField()
gender = serializers.CharField()
#如果我们期望的外键数据的key就是模型字段的名字,那么PrimaryKeyRelatedField()就可以关联的模型id值
#queryset 在验证数据的时候,我们要告诉系统,在哪里匹配外键数据
book = serializers.PrimaryKeyRelatedField(queryset=Book_new_Table.objects.all())
views.py
def People_serializer(request):
peopleinfo = People_new_table.objects.get(id=1)
ser = PeopleSerializer_2(instance=peopleinfo)
data = ser.data
return JsonResponse(data)
第三种序列化器
serializer.py
class PeopleSerializer_3(serializers.Serializer):
id = serializers.IntegerField()
people_name = serializers.CharField()
people_info = serializers.CharField()
gender = serializers.CharField()
#如果我们期望的外键数据的key就是模型字段的名字,那么PrimaryKeyRelatedField()就可以关联的模型id值
book = serializers.PrimaryKeyRelatedField(read_only=True)
views.py
def People_serializer(request):
peopleinfo = People_new_table.objects.get(id=1)
ser = PeopleSerializer_2(instance=peopleinfo)
data = ser.data
return JsonResponse(data)
第四种序列化器
serializer.py
class PeopleSerializer_4(serializers.Serializer):
id = serializers.IntegerField()
people_name = serializers.CharField()
people_info = serializers.CharField()
gender = serializers.CharField()
book = serializers.StringRelatedField() #跟主表的__str__ 返回的有关,返回名字那么外键book,就为书籍名字
view.py
def People_serializer(request):
peopleinfo = People_new_table.objects.get(id=1)
ser = PeopleSerializer_4(instance=peopleinfo)
data = ser.data #{'id': 1, 'people_name': '小明', 'people_info': '活了好久了', 'gender': '1', 'book': '西游记'}
return JsonResponse(data)
第五种序列化器,最好用的一种
serializers.py
from rest_framework import serializers
class BookSerializer(serializers.Serializer):
id = serializers.IntegerField()
book_name = serializers.CharField()
class PeopleSerializer_5(serializers.Serializer):
id = serializers.IntegerField()
people_name = serializers.CharField()
people_info = serializers.CharField()
gender = serializers.CharField()
book = BookSerializer()
view.py
def People_serializer(request):
peopleinfo = People_new_table.objects.get(id=1)
ser = PeopleSerializer_5(instance=peopleinfo)
data = ser.data
print(data) #{'id': 1, 'people_name': '小明', 'people_info': '活了好久了', 'gender': '1', 'book': OrderedDict([('id', 1), ('book_name', '西游记')])}
return JsonResponse(data)
反序列化
反序列化器单个字段验证
serializer.py
from rest_framework import serializers
"""
required = False 为True的时候为必传项
read_only = True 默认为False 只用于序列化使用,反序列化的时候忽略该字段
write_only = True默认为 False 只是用于反序列化使用,序列化的时候,忽略该字段
"""
class BookSerializer(serializers.Serializer):
id = serializers.IntegerField(required=False) #required = False 默认为True验证数据的时候不验证id
book_name = serializers.CharField(max_length=10,min_length=3)
read_count = serializers.IntegerField(required=True)
#validate_字段名 验证read_count数据是否满足要求
def validate_read_count(self,value):
if value < 0:
#第一种:自定义异常
#raise Exception("阅读量不能为负数") # 异常例子:Exception: 阅读量不能为负数
#第二种:系统抛出异常
raise serializers.ValidationError("阅读量不能为负数") #异常例子: ValidationError: {'read_count': [ErrorDetail(string='阅读量不能为负数', code='invalid')]}
return value
view.py
def Fan_Book_serializer(request):
dict1 = {"id": 5, "book_name": "语文书","read_count":20}
ser = BookSerializer(data=dict1) #创建序列化器
ser.is_valid(raise_exception=True) #验证数据
反序列化多个字段验证
serializer.py
class BookSerializer(serializers.Serializer):
id = serializers.IntegerField(required=False) #required = False 默认为True验证数据的时候不验证id
book_name = serializers.CharField(max_length=10,min_length=3)
read_count = serializers.IntegerField(required=True)
comment_count = serializers.IntegerField(required=False)
#validate_字段名 验证数据是否要求
def validate_read_count(self,value):
if value < 0:
#第一种:自定义异常
#raise Exception("阅读量不能为负数") # 异常例子:Exception: 阅读量不能为负数
#第二种:系统抛出异常
raise serializers.ValidationError("阅读量不能为负数") #异常例子: ValidationError: {'read_count': [ErrorDetail(string='阅读量不能为负数', code='invalid')]}
return value
def validate(self,data):
read_count = data.get("read_count")
comment_count = data.get('comment_count')
if read_count < comment_count:
raise serializers.ValidationError("评论量不可以大于阅读量")
return data
def create(self, validated_data): #validated_data = dict1
return Book_new_Table.objects.create(**validated_data)
view.py
def Fan_Book_serializer(request):
dict1 = {"id":5,"book_name":"语文书","read_count":20,"comment_count":30}
ser = BookSerializer(data=dict1)
ser.is_valid(raise_exception=True)
ser.save()
return JsonResponse({"code":200,'msg':"保存成功"})