相关疑难解决方法(0)

Django自定义管理器 - 如何仅返回登录用户创建的对象?

我想覆盖自定义对象模型管理器,只返回特定用户创建的对象.管理员用户仍应使用对象模型管理器返回所有对象.

现在我找到了一种可行的方法.他们建议创建自己的中间件,如下所示:

#### 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
Run Code Online (Sandbox Code Playgroud)

在自定义管理器中,您可以调用该get_current_user()方法仅返回特定用户创建的对象.

class UserContactManager(models.Manager):
    def get_query_set(self):
        return super(UserContactManager, self).get_query_set().filter(creator=get_current_user())
Run Code Online (Sandbox Code Playgroud)

这是一个很好的方法来处理这个用例吗?这会有用吗?或者这就像"使用大锤破解坚果"?;-)

只是使用:

Contact.objects.filter(created_by= user)
Run Code Online (Sandbox Code Playgroud)

在每个视图中看起来都不是很整洁.

编辑不要使用这种中间件方法!

使用下面Jack M.所述的方法

经过一段时间的测试后,这种方法表现得相当奇怪,通过这种方法,您可以将全局状态与当前请求混合在一起.

使用下面介绍的方法.它非常简单,无需乱搞中间件. …

django django-models django-managers django-custom-manager

31
推荐指数
2
解决办法
1万
查看次数