Я хочу применить обязательную фильтрацию практически ко всем моделям, ко всем запросам в довольно большом приложении django.На самом деле я ищу правильный способ реализации промежуточного программного обеспечения, управляемого запросами (вместо стандартного промежуточного программного обеспечения, управляемого запросами), но без манипуляций с каким-либо драйвером БД (без исправлений, переносов и т. Д.).
Идея состоит в том, чтобы использовать один общий миксин для QuerySets и Managers, чтобы этот метод всегда был доступен:
AnyModel.objects.filter_by_organization()
без необходимости передавать туда параметр.
и более поздние:
AnyModel.org_objects
занимаюсь filter_by_organization()
самовывозом
Моя главная задача - безопасность потоков.не могли бы вы рассмотреть мой подход ниже?this_thread = threading.local ()
... standard django middleware:
class OrganizationMiddleware(object):
def process_request(self, request):
this_thread.request = request
def process_response(self, request, response):
if hasattr(this_thread, 'request'):
del this_thread.request # doubtful
return response
def process_exception(self, request, exception):
if hasattr(this_thread, 'request'):
del this_thread.request # doubtful
...
... mixin/manager:
class OrganizationQuerySet(models.QuerySet):
def _get_current_request(self):
return getattr(this_thread, "request", None)
def filter_by_organization(self):
request = self._get_current_request()
org_id = getattr(request.user, 'organization_id', None)
return self.filter(...filtering by org_id + extra logic...)
# keeping this in one place has additional benefits
... in models:
org_objects = OrganizationQuerySet.as_manager()
... then using above without a need to pass request