Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 正在缓存Django get\u query\u集覆盖_Python_Django_Filter_Dry_Django Queryset - Fatal编程技术网

Python 正在缓存Django get\u query\u集覆盖

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_

我在我的一个模型上动态重写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_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检索对象时,它们也会被过滤。

我看不出装饰器在哪里?