Django有没有办法直接从模型中获取当前经过身份验证的用户?

时间:2012-08-31 17:16:04

标签: python django authentication model

就像我有一个像

这样的消息模型
class Message(models.Model):
    from = models.ForeignKey(User)
    to = models.ManyToManyField(User)

    def get_authenticated_user_inbox_messages(self):
        return Message.objects.filter(to=authenticated_user).all()

authenticated_user 是获取当前经过身份验证的用户的一种方式。

在视图中,我可以通过 request.user

获取经过身份验证的用户

但是,如果我不想或不能通过设计将其作为参数传递,有没有办法直接从模型内部获取它?

有什么想法吗?非常感谢你!

2 个答案:

答案 0 :(得分:2)

不,这是不可能的。模型对象独立于Web请求而存在。例如,您可以定义一个管理命令,该命令使用命令行中的模型对象,其中没有请求。

我所看到的一个好习惯是在Model对象上定义一个静态方法,该方法将User对象作为输入,如下所示:

class Message(models.Model):
    from = models.ForeignKey(User)
    to = models.ManyToManyField(User)

    @staticmethod
    def get_messages_to(user):
        return Message.objects.filter(to=user)

    @staticmethod
    def get_messages_from(user):
        return Message.objects.filter(from=user)

您还可以为模型定义自定义管理器,并在那里定义这些便捷方法。

编辑:好的,技术上可行,但我不建议这样做。有关方法,请参阅Global Django Requests

答案 1 :(得分:0)

当您将消息中的外键设置为用户时,django会自动在用户模型实例上创建相关字段。 (见https://docs.djangoproject.com/en/dev/topics/db/queries/#backwards-related-objects

因此,如果您有用户对象,则应该能够访问user_object.messages.all()。这对于做get_authenticated_user_inbox_messages()方法正在做的事情来说,感觉就像是一种更适合django的方式。