gpt4 book ai didi

Django QuerySet 更新性能

转载 作者:行者123 更新时间:2023-12-01 14:45:48 24 4
gpt4 key购买 nike

哪个对性能更好?

我们拿了一片产品。这使我们无法批量更新。

products = Product.objects.filter(featured=True).order_by("-modified_on")[3:]

for product in products:
product.featured = False
product.save()

或(无效)

<罢工>

<罢工>
for product in products.iterator():
product.update(featured=False)

<罢工>

我也尝试过 QuerySet 的 in 声明,如下所示。

Product.objects.filter(pk__in=products).update(featured=False)

这一行在 SQLite 上运行良好。但是,它会在 MySQL 出现异常后上升。所以,我不能使用它。

DatabaseError: (1235, "This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'")

编辑: iterator() 方法也会导致重新评估查询。因此,这对性能不利。

最佳答案

正如@Chris Pratt 在评论中指出的那样,第二个示例无效,因为对象没有更新方法。您的第一个示例将需要等于 results+1 的查询,因为它必须更新每个对象。如果您有 1000 种产品,那可能真的很昂贵。理想情况下,如果可能,您确实希望将其减少为更固定的费用。

这个和另一个问题类似:
Django: Cannot update a query once a slice has been taken

话虽这么说,您至少必须在 2 个查询中执行此操作,但您必须对如何构建 LIMIT 有点偷偷摸摸...

使用 Q objects for complex queries :

# get the IDs we want to exclude
products = Product.objects.filter(featured=True).order_by("-modified_on")[:3]
# flatten them into just a list of ids
ids = products.values_list('id', flat=True)

# Now use the Q object to construct a complex query
from django.db.models import Q
# This builds a list of "AND id NOT EQUAL TO i"
limits = [~Q(id=i) for i in ids]
Product.objects.filter(featured=True, *limits).update(featured=False)

关于Django QuerySet 更新性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10691183/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com