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添加。

 

posted on 2022-08-05 10:58  一先生94  阅读(92)  评论(0编辑  收藏  举报

导航