drf之序列化(ModelSerializer应用)

102 阅读1分钟

1.数据库表设计models

from django.db import models


class Depart(models.Model):
    title = models.CharField(verbose_name="部门", max_length=32)
    order = models.IntegerField(verbose_name="顺序")
    count = models.IntegerField(verbose_name="人数")


class Tag(models.Model):
    caption = models.CharField(verbose_name="标签", max_length=32)


class UserInfo(models.Model):
    name = models.CharField(verbose_name="姓名", max_length=32)
    age = models.IntegerField(verbose_name="年龄")

    gender = models.SmallIntegerField(verbose_name="性别", choices=((1, "男"), (2, "女")))
    depart = models.ForeignKey(verbose_name="部门", to="Depart", on_delete=models.CASCADE)

    ctime = models.DateTimeField(verbose_name="时间", auto_now_add=True)

    tags = models.ManyToManyField(verbose_name="标签", to="Tag")

2.序列化类

2.1 普通序列化

class UserSerializer(serializers.ModelSerializer):
    gender_text = serializers.CharField(source="get_gender_display")  # 获取choice文本内容
    depart = serializers.CharField(source="depart.title")  # 跨表获取文本内容
    ctime = serializers.DateTimeField(format="%Y-%m-%d")    # 对日进行格式化
    
    # 自定义字段
    xxx = serializers.SerializerMethodField()

    class Meta:
        model = models.UserInfo
        fields = ["name", "age", "gender_text", "depart", "ctime", "xxx"]
        
    # 自定义字段的赋值函数
    def get_xxx(self, obj):
        queryset = obj.tags.all()
        result = [{'id': tag.id, 'caption': tag.caption} for tag in queryset]
        return result

2.2 嵌套序列化

class DepartModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Depart
        fields = "__all__"


class TagModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Tag
        fields = "__all__"


class UserModelSerializer(serializers.ModelSerializer):
    depart = DepartModelSerializer()
    tag = TagModelSerializer(many=True)

    class Meta:
        model = models.UserInfo
        fields = ["name", "age", "depart", "tag"]

3.view视图中应用

class UserView(APIView):
    def get(self, request, *args, **kwargs):
    
        # 1.获取数据,多个object
        queryset = models.UserInfo.objects.all()
        
        # 2.序列化,多个object时,many=true,单个object时,many=false
        ser = UserSerializer(instance=queryset, many=True)

        # 3.返回给用户
        context = {"status": True, "data": ser.data}

        return Response(context)