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>
这将总共进行三个查询:
- 一个查询来获取相关的
Class
es;
- 一次查询以获取相关的
Student
;和
- 一个查询创建
Class
和 Student
之间的所有连接。
我们有一个学生和 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>
这将总共进行三个查询:
- 一个查询来获取相关的
Class
es; - 一次查询以获取相关的
Student
;和 - 一个查询创建
Class
和Student
之间的所有连接。