【问题标题】:Avoiding django QuerySet caching in a @staticmethod [duplicate]避免在@staticmethod中缓存django QuerySet [重复]
【发布时间】:2011-05-12 22:40:09
【问题描述】:

以下几行代码说明了我用来处理数据的分布式工作器模型。作业正在数据库中创建,它们的数据进入大驱动器,一旦所有信息可用,作业状态将设置为“等待”。从这里开始,多个活跃的工人开始发挥作用:他们每个人都不时发出一个查询,在其中它试图“声称”一份工作。为了同步声明,查询被封装到一个事务中,如果查询返回一个候选人,该事务会立即更改作业状态。到目前为止一切顺利。

问题是声明调用仅在第一次有效。阅读 QuerySet 及其缓存行为,在我看来,将静态方法和 QuerySet 缓存结合起来总是依赖于缓存......请自行查看:

我有一个派生自 django.db.models.Model 的类:

class Job(models.Model):
[...]

我在其中定义了以下静态函数。

@staticmethod
@transaction.commit_on_success
def claim():
    # select the oldest, top priority job and 
    # update its record
    jobs = Job.objects.filter(state__exact = 'WAITING').order_by('-priority', 'create_timestamp')
    if jobs.count() > 0:
        j = jobs[0]
        j.state = 'CLAIMED'
        j.save()
        logger.info('Job::claim: claimed %s' % j.name)
        return j
    return None

我做错了什么明显的事情吗?有什么更好的方法来处理这个问题?如何确保 QuerySet 不会在静态方法的不同调用中缓存其结果?还是我错过了什么并追逐幻影?任何帮助将不胜感激...谢谢!

【问题讨论】:

    标签: python django django-models


    【解决方案1】:

    为什么不只使用一个普通的模块级函数claim_jobs() 来运行查询?

    def claim_jobs():
    
        jobs = Job.objects.filter(...)
        ... etc.
    

    【讨论】:

    • 嗯。糟糕的设计——静态方法确实属于类。
    • 取决于你如何看待它。一个普通的函数很有可能更有效。
    猜你喜欢
    • 2018-09-30
    • 2014-12-23
    • 2016-10-15
    • 2016-12-19
    • 2012-02-19
    • 1970-01-01
    • 2011-03-04
    • 2010-09-10
    • 2014-03-25
    相关资源
    最近更新 更多