python – 在数据在其他地方更改时迭代大型Django查询集

python – 在数据在其他地方更改时迭代大型Django查询集,第1张

概述迭代查询集,如下所示: class Book(models.Model): # <snip some other stuff> activity = models.PositiveIntegerField(default=0) views = models.PositiveIntegerField(default=0) def calculate_statisti 迭代查询集,如下所示:

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()queryset调用期间被缓存.当book.save()时,我感觉它正在使用旧的book.vIEws值.

有没有办法确保只更新活动字段?或者,假设有10万本书.这需要很长时间才能运行.但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 FBook.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查询集全部内容,希望文章能够帮你解决python – 在数据在其他地方更改时迭代大型Django查询集所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1192337.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存