【发布时间】:2018-01-18 10:45:17
【问题描述】:
我正在调用一个函数来启动一个需要更长执行时间的进程,完成了许多不同的事情。该函数主要处理特定类的实例,Item。这些项目按不同的属性分类:category1、category2 和 category3。
现在,有一个不同的模型将某种规则应用于这些类别:Rule,具有多对多属性:categories1、categories2 和 categories3。一条规则适用于Item,如果相同的规则指向不同的类别,则只应应用其中一个。由封装在函数中的某种逻辑来决定哪一个:
class Rule(models.Model):
warehouse = models.ForeignKey('Warehouse')
categories1 = models.ManyToManyField('Category1')
categories2 = models.ManyToManyField('Category2')
categories3 = models.ManyToManyField('Category3')
@staticmethod
def get_rules_that_applies(item):
rules = warehouse.rule_set.all()
if not rules.exists():
return None
# ... determine which rule applies to the item by filtering, etc.
return rule
问题在于get_rules_that_applies 方法。每次我们需要获取适用于某个项目的规则时,我再说一遍,我们正在谈论的过程中涉及到许多项目,warehouse.rule_set.all() 被调用。
由于这个过程中规则不会发生变化,所以我们可以把所有的规则都缓存在仓库里,但是怎么做呢?如何确保 warehouse = warehouse.rule_set.all() 被缓存并且所有对这些规则起作用的过滤和 QuerySet 操作都不会命中数据库?
【问题讨论】:
-
get_rules_that_applies 中的仓库是什么?
-
@DimaKudosh 是的,我应该提到它:
warehouse就像所有过程发生的“主/上下文”对象。应用程序中的所有内容都围绕单个warehouse实例。