如何为Queryset中的每个对象修改manytomany字段,尽可能少地访问数据库

时间:2014-08-27 14:25:50

标签: django django-queryset django-orm

我有两个模型:模式和类别。 模式有许多领域categories = models.ManyToManyField(Category, related_name='patterns')

我的视图从表单中获取类别的查询集。我需要使用这些类别标记所有模式,并从每个模式的categories字段中删除这些类别。

现在我按照以下方式进行:

patterns_to_remove_category = Pattern.objects.all()
for category in categories:
    patterns_to_remove_category = patterns_to_remove_category.filter(categories=category)

for pattern in patterns_to_remove_category:
    pattern.categories = pattern.categories.exclude(pk__in=[c.pk for c in categories])

但我想尽量减少数据库的点击次数。最好的方法是什么?

1 个答案:

答案 0 :(得分:0)

我建议您使用隐式through模型,并执行以下查询:

Pattern.categories.through.objects.filter(category__in=categories).delete()