【发布时间】:2019-02-12 15:38:28
【问题描述】:
我想做的事:
我正在尝试访问我的 django 模型中的请求对象,以便我可以使用 request.user 获取当前登录的用户。
我尝试过的:
我在this 网站上发现了一个黑客。但是 cmets 中有人指出在生产时不要这样做。
我还尝试覆盖模型的__init__ 方法,就像this 帖子中提到的那样。但我得到了一个 AttributeError: 'RelatedManager' object has no attribute 'request'
Models.py:
class TestManager(models.Manager):
def user_test(self):
return self.filter(user=self.request.user, viewed=False)
class Test(models.Model):
def __init__(self, *args, **kwargs):
self.request = kwargs.pop('request', None)
super(Test, self).__init__(*args, **kwargs)
user = models.ForeignKey(User, related_name='test')
viewed = models.BooleanField(default=False)
objects = TestManager()
【问题讨论】:
-
通常模型层应该永远有权访问
request对象。这个想法是模型层仅对业务逻辑进行建模,视图用于实现“用例”。所以这样做实际上会打破“层”。Models 及其关系是不请求感知的,因为模型本身不是通过请求处理的(例如通过命令)。 -
此外,引用的文章实际上是非常有问题的:如果应用程序处理并发请求,这可能会变得非常糟糕,因为请求是通过中间件的最新请求,而不是那个由控制流处理。
标签: django django-models django-request