0
点赞
收藏
分享

微信扫一扫

43岁程序员,投了上万份简历都已读不回,只好把年龄改成40岁,这才有了面试机会,拿到了offer!...

老王420 2023-04-27 阅读 41

第一种

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':"保存成功"})
举报

相关推荐

0 条评论