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")