ORM中多对多添加问题。
这个问题,自己花了一小段时间才真正搞明白。这里记录下。
首先创建模型类。
1 from django.db import models 2 3 # Create your models here. 4 class Clas(models.Model): 5 name = models.CharField(max_length=32, unique=True, verbose_name="班级名称") 6 7 class Meta: 8 db_table = "db_class" 9 10 11 class Course(models.Model): 12 name = models.CharField(max_length=32, unique=True, verbose_name="课程名称") 13 14 class Meta: 15 db_table = "db_course" 16 17 18 class Student(models.Model): 19 sex_choices = ( 20 (0, "女"), 21 (1, "男"), 22 (2, "保密"), 23 ) 24 25 name = models.CharField(max_length=32, unique=True, verbose_name="姓名") 26 age = models.SmallIntegerField(verbose_name="年龄", default=18) # 年龄 27 sex = models.SmallIntegerField(choices=sex_choices) 28 birthday = models.DateField() 29 30 # 一对多 31 # on_delete= 关联关系的设置 32 # models.CASCADE 删除主键以后, 对应的外键所在数据也被删除 33 # models.DO_NOTHING 删除主键以后, 对应的外键不做任何修改 34 # 反向查找字段 related_name 35 clas = models.ForeignKey(to="Clas", on_delete=models.CASCADE) # django默认会拼接一个字段,clas_id (int类型) 默认会去 “Clas”表中关联主键 在studnet表中。这边有一个细节就是:这个里面默认是 db_constraint=True,可以将db_constraint改为False,表示不约束。 36 37 # 多对多 38 # 建立多对多的关系,ManyToManyField可以建在两个模型中的任意一个,自动创建第三张表 39 courses = models.ManyToManyField(to="Course", db_table="db_student2course",null=True) 40 41 # 一对一,使用同一对多 42 stu_detail = models.OneToOneField("StudentDetail", on_delete=models.CASCADE) 43 44 class Meta: 45 db_table = "db_student" 46 47 def __str__(self): 48 return self.name 49 50 51 class StudentDetail(models.Model): 52 tel = models.CharField(max_length=32) 53 email = models.EmailField() 54 description = models.TextField(null=True, verbose_name="个性签名") 55 56 class Meta: 57 db_table = "db_student_detail"
多对多添加的几个方法:
一、通过传递对象添加
# 先添加一个学生数据,当前Clas表和StudentDetail表默认有数据
stu = Student.objects.create(name="rain", age=33, sex=1, birthday="1996-11-12", clas_id=1, stu_detail_id=1)
# 先取到name=python课程的Course对象
c1 = models.Course.objects.get(name='python课程')
# 取到name= ‘王五’的学生对象 stu1 = models.Student.objects.filter(name="王五").first()
# 学生对象.courses.add(课程对象) 这个样子就添加了 stu1.courses.add(c1)
二、通过id添加
# 先取到name=python课程的Course对象的id c1 = models.Course.objects.get(name='python课程')
cid = c1.id # 取到name= ‘王五’的学生对象 stu1 = models.Student.objects.filter(name="王五").first() # 学生对象.courses.add(id) 这个样子就添加了 stu1.courses.add(cid )
实际开发过程中,经常会通过列表来添加。如下:通过传递对象列表添加
c1 = models.Course.objects.get(name='python课程') c2 = models.Course.objects.get(name='linux课程') course_list = [c1,c2] stu1 = models.Student.objects.filter(name="王五").first() stu1.courses.add(*course_list)
当然可以通过传递id列表来添加,就不一一赘述了。总之,多对多添加数据,可以传递对象添加,也可以传递id添加。