Django自定义管理器-如何仅返回已登录用户创建的对象?
我想覆盖自定义对象模型管理器,以仅返回特定用户创建的对象。管理员用户仍应使用对象模型管理器返回所有对象。
现在,我找到了一种可行的方法。他们建议创建自己的中间件,如下所示:
#### myproject/middleware/threadlocals.pytry:
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)
在每个视图中,对我来说看起来都不是很整洁。
编辑不要使用这种中间件方法!
使用下面的Jack M.
经过一段时间的测试,这种方法的行为非常奇怪,并且使用这种方法,你将全局状态与当前请求混合在一起。
使用下面介绍的方法。这真的很容易,不需要使用中间件。
在模型中创建一个自定义管理器,该函数具有将当前用户或任何其他用户作为输入的功能。
#in your models.pyclass 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)
回答:
解决此问题的一种方法是创建一个新方法,而不是重新定义get_query_set
。类似于以下内容:
class UserContactManager(models.Manager): def for_user(self, user):
return super(UserContactManager, self).get_query_set().filter(creator=user)
class UserContact(models.Model):
[...]
objects = UserContactManager()
这使你的视图看起来像这样:
contacts = Contact.objects.for_user(request.user)
这应该有助于使视图保持简单,并且因为你将使用Django的内置功能,所以将来不太可能中断。
以上是 Django自定义管理器-如何仅返回已登录用户创建的对象? 的全部内容, 来源链接: utcz.com/qa/407240.html