class SerialierTeacherClass(serializers.ModelSerializer):
teacher_ids=serializers.ListField(
child=serializers.IntegerField(),allow_empty=False
,write_only=True
)
classid=serializers.SerializerMethodField(read_only=True)
teacher_id=serializers.SerializerMethodField(read_only=True)
class Meta:
model = models.TeacherClass
fields = ["class_id","teacher_id","teacher_ids","classid"]
extra_kwargs={
"teacher_id":{"read_only":True},
"class_id":{"write_only":True}
}
def get_classid(self,queryset):
if isinstance(queryset,list):
sets=set()
for obj in queryset:
sets.add(obj.class_id)
return list(sets)
def get_teacher_id(self,queryset):
if isinstance(queryset,list):
sets=set()
for obj in queryset:
sets.add(obj.teacher_id)
return list(sets)
def create(self, validated_data):
# todo default for update args ,**kwargs is for filter
teacher_ids=validated_data.pop("teacher_ids")
bulks=[]
for teacher_id in teacher_ids:
teacher_class_object=TeacherClass(teacher_id=teacher_id,**validated_data)
bulks.append(teacher_class_object)
objs=TeacherClass.objects.bulk_create(bulks)
return objs
模型:
class TeacherClass(models.Model):
teacher_id =models.IntegerField(max_length=200)
class_id =models.IntegerField()
is_delete = models.BooleanField(default=False)
class Meta :
db_table="tbl_teacher_class"
verbose_name="老师表"
# unique_together=("class_id","teacher_id")
第二种:
以list形式存储某个字段:
比如前端传参数老师id为数组存在tbl_teacher_class:
{
"teacher_ids": [1,2],
"class_id": 1
}
class SerialierTeacherClass(serializers.ModelSerializer):
teacher_id=serializers.ListField(
child=serializers.IntegerField(),allow_empty=False
)
class Meta:
model = models.TeacherClass
# fields = ["class_id","teacher_id","teacher_ids","classid"]
fields = ["class_id", "teacher_id"]
extra_kwargs={
}
def create(self, validated_data):
# todo default for update args ,**kwargs is for filter
obj,created_status=TeacherClass.objects.update_or_create(defaults=validated_data,**validated_data)
return obj
模型:
class TeacherClass(models.Model):
teacher_id =models.CharField(max_length=100)
class_id =models.IntegerField()
is_delete = models.BooleanField(default=False)
class Meta :
db_table="tbl_teacher_class"
verbose_name="老师表"
# unique_together=("class_id","teacher_id")

relation关联减少重复数据问题:
class SerializerTeacher(serializers.ModelSerializer):
class Meta:
model = models.Teacher
fields = "__all__"
class SerializerStudent(serializers.ModelSerializer):
"""
# serializers_class=SerializerClass(instance=class_object,many=False)
# res.append(serializers_class.data)
"""
user_sex = serializers.CharField(source="get_sex_display", read_only=True)
class_info = serializers.SerializerMethodField(read_only=True)
teachers = serializers.SerializerMethodField(read_only=True)
class Meta:
model = models.Student
fields = ["id", "class_id", "sex", "class_info", "user_sex", "name", "teachers"]
extra_kwargs = {
"id": {"read_only": True},
"sex": {"write_only": True},
"is_delete": {"write_only": True}
}
def get_class_info(self, object):
class_queryset = models.Class.objects.filter(id__exact=object.class_id).all()
res = [class_object.cname for class_object in class_queryset]
return res
def get_teachers(self, object):
teacher_ids = TeacherClass.objects.filter(class_id__exact=object.class_id).all().values("teacher_id")
# todo can filter by queryset
teacher_queryset = models.Teacher.objects.filter(id__in=teacher_ids).all()
res = [item.tname for item in teacher_queryset]
return res
class SerializerClass(serializers.ModelSerializer):
class Meta:
model = models.Class
fields = ["id", "cname", "create_time", "update_time", "is_delete"]
extra_kwargs = {
"id": {"read_only": True},
"is_delete": {"write_only": True},
}
class SerialierTeacherClass(serializers.ModelSerializer):
class Meta:
model = models.TeacherClass
fields = ["class_id", "teacher_id"]
def create(self, validated_data):
obj,is_create=TeacherClass.objects.get_or_create(defaults=validated_data,**validated_data)
return obj
模型:
from django.db import models
class Teacher(models.Model):
tname=models.CharField(max_length=30,error_messages={"required":True},unique=True)
address=models.CharField(200,max_length=100)
age=models.IntegerField(default=18)
is_delete=models.BooleanField(default=False)
class Meta :
db_table="tbl_teacher"
verbose_name="老师表"
class Class(models.Model):
cname = models.CharField(max_length=32,unique=True)
create_time= models.DateField(auto_now_add=True,null=True)
update_time=models.DateField(auto_now=True,null=True)
is_delete=models.BooleanField(default=False)
def __str__(self):
return self.cname
class Meta :
db_table="tbl_class"
verbose_name="老师表"
class Student(models.Model):
""" 注意一对一反向查询和多对一有区别"""
name = models.CharField(max_length=32,unique=True)
sex_choice=[(0,"男"),(1,"女")]
sex=models.IntegerField(choices=sex_choice,verbose_name="性别",error_messages={"required":True})
class_id =models.PositiveIntegerField()
is_delete=models.BooleanField(default=False)
class Meta :
db_table="tbl_student"
verbose_name="学生表"
class TeacherClass(models.Model):
teacher_id =models.IntegerField(max_length=100)
class_id =models.IntegerField()
is_delete = models.BooleanField(default=False)
class Meta :
db_table="tbl_teacher_class"
verbose_name="老师表"
# unique_together=("class_id","teacher_id")