Я хочу перезаписать диспетчер модели пользовательских объектов только для возврата объектов, созданных определенным пользователем. Пользователи-администраторы должны возвращать все объекты с помощью диспетчера модели объектов.
Теперь я нашел подход, который мог бы работать. Они предлагают создать собственное промежуточное ПО, выглядящее так:
#### 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)
в каждом представлении не выглядит очень аккуратно для меня.
EDIT Не используйте этот метод промежуточного программного обеспечения!!!
используйте подход, описанный Джеком М. нижеЧерез некоторое время тестирование этого подхода показалось довольно странным, и при таком подходе вы смешиваете глобальное состояние с текущим запросом.
Используйте подход, представленный ниже. Это действительно легко и не нужно взламывать промежуточное ПО.
создайте в своей модели пользовательский менеджер с функцией, которая ожидает, что текущий пользователь или любой другой пользователь будет введен в качестве входа.
#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)
См. также обсуждение относительно подхода на основе мультимедиа.