就像我有一个像
这样的消息模型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
获取经过身份验证的用户但是,如果我不想或不能通过设计将其作为参数传递,有没有办法直接从模型内部获取它?
有什么想法吗?非常感谢你!
答案 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的方式。