Я переопределяю функцию get_query_set в Django на одной из моих моделей динамически.Я делаю это для принудительной фильтрации исходного набора запросов, возвращенного 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 на моем сервере, появятся объекты для вновь выбранного сценария.Я думаю, что он кэширует измененный класс, а затем, когда сценарий изменяется, он применяет другой фильтр, который никогда не будет иметь смысла, поскольку объекты могут иметь только один сценарий за раз.
Это не былопроблема с пользовательскими фильтрами, потому что пользователь никогда не меняется для моего сеанса.Пассажир делает что-то глупое, чтобы удерживать объекты класса между запросами?Должен ли я опираться на этот странный шаблон проектирования и просто применять эти фильтры для каждого просмотра?Должна быть лучшая практика для фильтров DRYing, которые применяются ко многим представлениям, основанным на чем-то динамическом, например, текущем пользователе.