Django-使用ManyToMany字段将同一组对象添加到查询集



我有披萨和浇头。

class Pizza(ModelBase):
name = models.CharField(max_length=255)
toppings = models.ManyToManyField('Topping', blank=True, related_name='pizzas')

class Topping(ModelBase):
name = models.CharField(max_length=255)

假设我想将浇头TomatoCheese添加到数据库中的每个披萨中。目前我可以用一个讨厌的for循环来完成:

toppings = Toppings.objects.filter(Q(name='Tomato') | Q(name='Cheese'))
for pizza in Pizza.objects.all():
pizza.toppings.add(*toppings)

有没有一种方法可以做到同样的事情,而不必把所有的披萨都绕圈?也许使用Django创建的直通表?

我知道我可以使用以下查询从所有披萨中删除浇头:

Pizza.toppings.through.objects.filter(topping__in=toppings).delete()

但如果没有for循环,我无法在多个披萨中添加浇头。

您可以使用来自反向关系的.set((为注释中提到的每个浇头披萨设置,也可以通过表条目进行bulk_create

以下内容:

topping_ids = Toppings.objects.filter(
Q(name='Tomato') | Q(name='Cheese')
).values_list('id', flat=True)
pizza_ids= Pizza.objects.values_list('id', flat=True)
through_objects = [Pizza.toppings.through(topping_id=entry[0],
pizza_id=entry[1]) for entry in
itertools.product(topping_ids, pizza_ids)]

Pizza.toppings.through.objects.bulk_create(through_objects)

相关内容

最新更新