【发布时间】:2020-11-10 01:30:15
【问题描述】:
我有比萨饼和配料。
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)
假设我想将浇头Tomato 和Cheese 添加到我数据库中的每个披萨中。
目前我可以用一个讨厌的 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 循环的情况下向多个比萨饼添加配料。
【问题讨论】:
-
afaik,没有循环你不能这样做。因为 Django 需要
add(...)、set(...)等方法来附加 M2M 对象,该方法仅适用于对象,不适用于查询集。
标签: django django-models django-orm