1

就像我有一个像这样的消息模型

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获取经过身份验证的用户

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

有任何想法吗?非常感谢你!

4

2 回答 2

2

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

我认为一个好的做法是在您的模型对象上定义一个静态方法,该方法将用户对象作为输入,如下所示:

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

于 2012-08-31T17:22:15.853 回答
0

当您将设置的外键从 Messages 连接到 Users 时,django 会自动在 User 模型实例上创建相关字段。(见https://docs.djangoproject.com/en/dev/topics/db/queries/#backwards-related-objects

所以,如果你有一个用户对象,你应该能够访问user_object.messages.all(). 这感觉像是一种更适合 django 的方式来执行您的get_authenticated_user_inbox_messages()方法正在执行的操作。

于 2012-08-31T17:25:14.317 回答