аватар question@mail.ru · 01.01.1970 03:00

Доступ к request.user из модели Django

Пишу сайт на Django. Есть такая проблема: Есть модель Client для почти везде на сайте пользователю надо выводить его клиентов. Вначале писал в каждом виде так:

Client.objects.filter(user=request.user)

Потом в сделал свой Менеджер с методом в который надо передавать пользователя, но вообщем это не избавляет от проблемы постоянно передавать пользователя. Как можно сделать что бы текущий пользователь был доступен в models.py?

аватар answer@mail.ru · 01.01.1970 03:00

Вообще это нарушает логику работы Django. Там предлагается таскать объект Request вручную, и, да, делать Client.objects.filter(user=request.user). Если это делается много раз, можно ведь и в функцию оформить:

# models.py...def own_clients(request):    retu Client.objects.filter(user=request.user)...

И, соответственно, пользоваться:

# views.pyfrom .models import ..., own_clients...    ... = own_clients(request).all()

С другой стороны, в принципе, сделать копию request локальной для потока:

# middleware.pyimport threading_local_storage = threading.local()class CurrentRequestMiddleware(object):    def process_request(self, request):        _local_storage.request = requestdef get_current_request():    retu getattr(_local_storage, ""request"", None)def get_current_user():    request = get_current_request()    if request is None:        retu None    retu getattr(request, ""user"", None)

В settings.py добавить в MIDDLEWARE_CLASSES этот CurrentRequestMiddleware и далее использовать, как и у Вас:

# models.pyfrom django.db import modelsfrom .middleware import get_current_userclass OwnManager(models.Manager):    def get_queryset(self):        qs = super(OwnManager, self).get_queryset()        retu qs.filter(user=get_current_user())class Client(models.Model):    ...    own_objects = OwnManager()

Но все это будет работать до тех пор, пока не поменяется внутреннее устройство фреймворка, а гарантий, что на каждый запрос создается отдельный поток никто не давал (хотя по факту это, вроде бы, и так). Например, я бы не поручился за работоспособность этого при использовании совместно с django-gevent.

Последние

Похожие