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

现在我找到了an approach个可以用的.他们建议创建您自己的中间件,如下所示:

#### 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

在Custom管理器中,您可以调用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)

在我看来,每张照片都不是很整洁.

编辑请勿使用此中间件方法!

use the approach stated by Jack M. below

经过一段时间的测试后,此方法的行为相当奇怪,并且使用此方法时,您会将全局状态与当前请求混为一谈.

使用下面介绍的方法.这真的很简单,不需要使用中间件.

使用期望当前用户或任何其他用户作为输入的函数在模型中创建自定义管理器.

#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)

另请参阅关于中间件方法的这discussion篇文章.

推荐答案

处理此问题的一种方法是创建一个新方法,而不是重新定义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相关问答推荐

如何根据属性的 Select 对查询集进行排序

使用自定义模型注册后,Django无法登录

为什么 Django 在错误的目录中寻找模板?

如何使用邮箱确认码创建django注册

为什么 django 不能相互识别 2 个路径转换器?

Django过滤器查询外键

Django 模板文件夹

如何解决 AssertionError: .accepted_renderer not set on Response in django and ajax

django 管理员登录突然要求 csrf 令牌

如何在不使用 sudo 的情况下安装 virtualenv?

Django 模型将外键设置为另一个模型的字段

从python中的URL获取查询字符串的最佳方法?

Django删除查询集的最后五个以外的所有内容

Django - 如何从模型中 Select 特定列?

如何从 django 的 db 模型中获取字段类型字符串

Django Rest Framework - 缺少静态目录

Django:如何将数据保存到 ManyToManyField?

如何过滤(或替换)在 UTF-8 中占用超过 3 个字节的 unicode 字符?

为整个结果集向 Django Rest Framework 结果添加额外数据

警告:找不到分发的 svn 位置==0.6.16dev-r0