程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Django自定义管理器-如何仅返回已登录用户创建的对象?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

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

开发过程中遇到Django自定义管理器-如何仅返回已登录用户创建的对象?的问题如何解决?下面主要结合日常开发的经验,给出你关于Django自定义管理器-如何仅返回已登录用户创建的对象?的解决方法建议,希望对你解决Django自定义管理器-如何仅返回已登录用户创建的对象?有所启发或帮助;

解决此问题的一种方法是创建一个新方法,而不是重新定义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的内置功能,所以将来不太可能中断。

解决方法

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

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

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

大佬总结

以上是大佬教程为你收集整理的Django自定义管理器-如何仅返回已登录用户创建的对象?全部内容,希望文章能够帮你解决Django自定义管理器-如何仅返回已登录用户创建的对象?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。