Python 正在缓存Django get\u query\u集覆盖
我在我的一个模型上动态重写Django的get\u query\u set函数。我这样做是为了使用decorator,通过场景值强制过滤Model.objects.all/filter/get返回的原始查询集。以下是装饰师的功能:Python 正在缓存Django get\u query\u集覆盖,python,django,filter,dry,django-queryset,Python,Django,Filter,Dry,Django Queryset,我在我的一个模型上动态重写Django的get\u query\u set函数。我这样做是为了使用decorator,通过场景值强制过滤Model.objects.all/filter/get返回的原始查询集。以下是装饰师的功能: # Get the base QuerySet for these models before we modify their # QuerySet managers. This prevents infinite recursion since the # get_
# Get the base QuerySet for these models before we modify their
# QuerySet managers. This prevents infinite recursion since the
# get_query_set function doesn't rely on itself to get this base QuerySet.
all_income_objects = Income.objects.all()
# Figure out what scenario the user is using.
current_scenario = Scenario.objects.get(user=request.user, selected=True)
# Modify the imported income class to filter based on the current scenario.
Expense.objects.get_query_set = lambda: all_expense_objects.filter(scenario=current_scenario)
# Call the method that was initially supposed to
# be executed before we were so rudely interrupted.
return view(request, **arguments)
我这样做是为了使代码干涸,这样我的所有查询就不会被额外的过滤器弄乱。但是,如果场景发生更改,则不会返回任何对象。如果我杀死服务器上的所有python进程,则会出现新选择场景的对象。我认为它在缓存修改过的类,然后当场景发生变化时,它会应用另一个过滤器,这是毫无意义的,因为对象一次只能有一个场景
基于用户的筛选器没有问题,因为我的会话中用户从不更改。乘客在请求之间抓住类对象是不是很愚蠢?我是否应该放弃这种奇怪的设计模式,只在每个视图的基础上实现这些过滤器?必须有一个最佳实践来干燥基于动态对象(如当前用户)的多个视图中应用的过滤器。如何为模型创建一个管理器对象,该对象将用户作为进行过滤的参数。我对DRY w/Django querysets的理解是使用模型管理器
#### view code:
def some_view(request):
expenses = Expense.objects.filter_by_cur_scenario(request.user)
# add additional filters here, or add to manager via more params
expenses = expenses.filter(something_else=True)
#### models code:
class ExpenseManager(models.Manager):
def filter_by_cur_scenario(self, user):
current_scenario = Scenario.objects.get(user=request.user, selected=True)
return self.filter(scenario=current_scenario)
class Expense(models.Model):
objects = ExpenseManager()
另外,对管理器的一个快速警告可能适用于覆盖get_query_set:外部关系将不考虑在此级别执行的任何筛选。例如,覆盖MyObject.objects.filter方法以始终过滤掉已删除的行;至少从我的理解来看,带有foreignkey的模型不会使用该过滤函数-如果我错了,请有人纠正我。我希望实现此实现,而不必在其他视图中编写任何代码。本质上,在导入类之后,我想修改它,以便无论使用Expense.objects.get/filter/all在何处引用它,它都已被过滤。因此,任何其他视图都不需要执行;它是完全透明的。而且,即使在我将其用作外键的情况下,当使用前面提到的Expense.objects.get/filter/all检索对象时,它们也会被过滤。我看不出装饰器在哪里?