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")
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):
queryset = models.UserInfo.objects.all()
ser = UserSerializer(instance=queryset, many=True)
context = {"status": True, "data": ser.data}
return Response(context)