django 当涉及多对多关系时,更新所有示例的字段

b1payxdu  于 2023-05-19  发布在  Go
关注(0)|答案(1)|浏览(204)

我有以下内容:

class Customer(model):
    stores = models.ManyToManyField(Store, related_name = "customers")
    subscriptions = models.ManyToManyField(Subscription, through = "CustomerSubscription")

class CustomerSubscription(model):
    subscription = models.ForeignKey(Subscription)
    customer = models.ForeignKey(Customer)

class Subscription(model):
    is_valid = models.BooleanField()

对于给定的商店示例:

store = Store.objects.get(pk=1)

我想获取所有客户的所有订阅,并将is_valid设置为False。
这是我的尝试,似乎是有效的:

customers = store.customers.all()
for c in customers:
    c.subscriptions.update(is_valid=False)

然后我尝试使用prefect_related:

customers = store.customers.prefect_related("subscriptions")
for c in customers:
    c.subscriptions.update(is_valid=False)

但我不相信我这样做是正确的,因为它导致更多的sql查询比我第一次尝试。我该怎么做?

u91tlkcl

u91tlkcl1#

问题是,你在一个循环中运行一个查询,这会创建很多请求(你拥有的用户越多,发出的请求就越多)。你可以做的是让它更容易,通过你的CustomerSubscription类,而不是客户类。
类似于:

cs = CustomerSubscription.update(subscription__is_valid=False)

它的工作方式是:
它将访问所有CustomerSubscription行并更新订阅值的is_valid值。注意subscription和is_valid之间的双下划线,它允许您跟踪条目之间的链接。

相关问题