【发布时间】:2010-01-20 19:48:35
【问题描述】:
遍历查询集,如下所示:
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()
【问题讨论】:
标签: python django django-models