【问题标题】:Django: How to efficiently add objects to ManyToManyFields of multiple objects?Django:如何有效地将对象添加到多个对象的 ManyToManyFields 中?
【发布时间】:2021-06-20 10:38:22
【问题描述】:

我们有一个学生和一个班级的多对多关系,一个学生可以参加多个班级,一个班级可以被多个学生参加。

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的所有类)添加到另一个@中每个对象的ManyToManyField的最快方法是什么? 987654324@(在我们的例子中:所有名字是 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)

【问题讨论】:

    标签: django django-models django-queryset django-orm django-related-manager


    【解决方案1】:

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

    biology_classes = Class.objects.filter(name__contains='Biology')
    linuses = Student.object.filter(first_name='Linus')
    
    StudentClass = Student.classes.through
    items = [
        StudentClass(student=student, class=class)
        for student in linuses
        for class in biologoy_classes
    ]
    
    StudentClass.objects.bulk_create(items)

    因此总共会产生三个查询:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-05
      • 2020-11-10
      • 1970-01-01
      • 1970-01-01
      • 2011-09-14
      • 1970-01-01
      • 2021-07-14
      • 1970-01-01
      相关资源
      最近更新 更多