Я хочу перезаписать менеджер модели пользовательских объектов, чтобы он возвращал только объекты, созданные конкретным пользователем. Пользователи с правами администратора должны по-прежнему возвращать все объекты, используя менеджер моделей объектов.
Теперь я нашел подход , который мог бы работать. Они предлагают создать ваше собственное промежуточное программное обеспечение, похожее на это:
#### myproject/middleware/threadlocals.py
try:
from threading import local
except ImportError:
# Python 2.3 compatibility
from django.utils._threading_local import local
_thread_locals = local()
def get_current_user():
return getattr(_thread_locals, 'user', None)
class ThreadLocals(object):
"""Middleware that gets various objects from the
request object and saves them in thread local storage."""
def process_request(self, request):
_thread_locals.user = getattr(request, 'user', None)
#### end
А в пользовательском менеджере вы можете вызвать метод get_current_user()
, чтобы вернуть только объекты, созданные конкретным пользователем.
class UserContactManager(models.Manager):
def get_query_set(self):
return super(UserContactManager, self).get_query_set().filter(creator=get_current_user())
Это хороший подход к этому варианту использования? Будет ли это работать? Или это как «использовать кувалду, чтобы сломать орех»? ; -)
Просто используя:
Contact.objects.filter(created_by= user)
в каждом представлении выглядит не очень аккуратно для меня.
РЕДАКТИРОВАТЬ Не используйте этот подход промежуточного программного обеспечения !!!
используйте подход, изложенный Джеком М. ниже
Через некоторое время тестирования этот подход вел себя довольно странно, и с этим подходом вы смешиваете глобальное состояние с текущим запросом.
Используйте подход, представленный ниже. Это действительно легко и не нужно взламывать промежуточное ПО.
создайте собственный менеджер в вашей модели с функцией, которая ожидает текущего пользователя или любого другого пользователя в качестве ввода.
#in your models.py
class HourRecordManager(models.Manager):
def for_user(self, user):
return self.get_query_set().filter(created_by=user)
class HourRecord(models.Model):
#Managers
objects = HourRecordManager()
#in vour view you can call the manager like this and get returned only the objects from the currently logged-in user.
hr_set = HourRecord.objects.for_user(request.user)
См. Также это обсуждение о подходе промежуточного программного обеспечения.