gpt4 book ai didi

python - 在数据在其他地方发生变化时迭代大型 Django 查询集

转载 作者:太空宇宙 更新时间:2023-11-03 13:24:40 26 4
gpt4 key购买 nike

遍历一个查询集,像这样:

class Book(models.Model):
# <snip some other stuff>
activity = models.PositiveIntegerField(default=0)
views = models.PositiveIntegerField(default=0)

def calculate_statistics():
self.activity = book.views * 4
book.save()

def cron_job_calculate_all_book_statistics():
for book in Book.objects.all():
book.calculate_statistics()

...工作得很好。但是,这是一项 cron 任务。 book.views 在发生这种情况时正在递增。如果在此 cronjob 运行时修改了 book.views,它将被还原。

现在,book.views 未被 cronjob 修改,但在 .all() 查询集调用期间被缓存。当 book.save() 时,我感觉它正在使用旧的 book.views 值。

有没有办法确保只有 activity 字段被更新?或者,假设有 100,000 本书。这将需要相当长的时间才能运行。但是 book.views 将来自查询集最初开始运行的时间。是否只使用 .iterator() 的解决方案?

更新:这就是我正在做的事情。如果您有关于如何使这项工作很好地内联的想法,那么我完全赞成。

def calculate_statistics(self):
self.activity = self.views + self.hearts.count() * 2
# Can't do self.comments.count with a comments GenericRelation, because Comment uses
# a TextField for object_pk, and that breaks the whole system. Lame.
self.activity += Comment.objects.for_model(self).count() * 4
self.save()

最佳答案

以下将在 Django 1.1 中为您完成工作,无需循环:

from django.db.models import F
Book.objects.all().update(activity=F('views')*4)

你也可以进行更复杂的计算:

for book in Book.objects.all().iterator():
Book.objects.filter(pk=book.pk).update(activity=book.calculate_activity())

这两个选项都有可能使事件字段与其他字段不同步,但我假设您对此没有意见,因为您是在 cron 作业中计算它。

关于python - 在数据在其他地方发生变化时迭代大型 Django 查询集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2104404/

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