Django:如何高效地将对象添加到多个对象的 ManyToManyFields 中?

Django: How to efficiently add objects to ManyToManyFields of multiple objects?

我们有一个学生和 class 多对多关系,其中一个学生可以选择多个 class,一个 class 可以被多个学生选择。

class Class(models.Model):
    name = models.CharField(null=False, max_length=128)

class Student(models.Model):
    first_name = models.CharField(null=False, max_length=64)
    classes = ManyToManyField(Class)

添加某些对象或整个对象的最快方法是什么 QueryList(在我们的例子中:名称中包含 Biology 的所有 classes) , 到另一个 QueryList 中每个对象的 ManyToManyField (在我们的例子中:所有名字是 Linus 的学生)?

我目前的做法是:

biology_classes = Class.objects.filter(name__contains='Biology')
linuses = Student.object.filter(first_name='Linus')
for linus in linuses:
    linus.classes.add(*biology_classes)

我猜这会影响每个学生的数据库。我想知道是否有某种方法可以“一次”完成所有操作。也许看起来像这样:

linuses.classes.add(*biology_classes) # (this does not work)

您可以使用单个查询为每个组合批量创建一条记录:

biology_classes = Class.objects.filter(name__contains='Biology')
linuses = Student.object.filter(first_name='Linus')

StudentClass = Student.classes.through
items = [
    <b>StudentClass(student=student, class=class)</b>
    for student in linuses
    for class in biologoy_classes
]

StudentClass.objects.<b>bulk_create(</b>items<b>)</b>

这将总共进行三个查询:

  1. 一个查询来获取相关的 Classes;
  2. 一次查询以获取相关的 Student;和
  3. 一个查询创建 ClassStudent 之间的所有连接。