Django ValueError:无法查询“用户”:必须是“个人资料”实例
Posted
技术标签:
【中文标题】Django ValueError:无法查询“用户”:必须是“个人资料”实例【英文标题】:Django ValueError: Cannot query "user": Must be "Profile" instance 【发布时间】:2021-02-15 01:53:45 【问题描述】:我正在尝试在 Django 中向我的博客应用程序添加简单的用户到用户消息传递功能。我有一个允许用户发送消息的视图,但之后我在显示消息时遇到了困难。这是我的消息模型:
class Message(models.Model):
user = models.ForeignKey(Profile, on_delete=models.CASCADE, related_name='messages')
sender = models.ForeignKey(Profile, on_delete=models.CASCADE, related_name='messages_from')
message = models.TextField(blank=True)
timestamp = models.DateTimeField(default=timezone.now, editable=False)
unread = models.BooleanField(default=True)
以及相关的Profile模型:
class Profile(models.Model):
first_name = models.CharField(max_length=100, blank=True)
last_name = models.CharField(max_length=100, blank=True)
user = models.OneToOneField(User, on_delete=models.CASCADE)
slug = models.SlugField(unique=True, blank=True)
updated = models.DateTimeField(auto_now=True)
created = models.DateTimeField(auto_now_add=True)
这是我的 MessagesView 尝试:
class MessagesView(ListView):
model = Profile
template_name = 'users/messages.html'
context_object_name = 'msg'
def get_queryset(self):
return Profile.objects.filter(messages_from__isnull=False, messages__user_id=self.request.user)
这是网址:
path('messages/<int:pk>/', MessagesView.as_view(), name='messages'),
在尝试加载此页面时,我收到错误Cannot query "user": Must be "Profile" instance
,其中“user”是我尝试加载的消息的登录用户的名称。我花了很长时间在谷歌上搜索解决方案,但没有找到与我的案例相关的任何内容。请帮忙
【问题讨论】:
你能分享Profile
的模型吗? MessagesView
也应该返回 Message
对象,而不是 Profile
对象。
您好,感谢您这么快的回复。帖子已编辑以现在显示 Profile
模型
【参考方案1】:
您的Message
具有user
字段ForeignKey
到Profile
,而不是User
(因此最好将该字段重命名为profile
)。因此,这意味着像messages__user_id=self.request.user
这样的过滤没有多大意义。
您可以按照从Profile
到User
的关系进行过滤:
class MessagesView(ListView):
model = Profile
template_name = 'users/messages.html'
context_object_name = 'msg'
def get_queryset(self):
return Profile.objects.filter(
messages_from__isnull=False,
messages__user__user=self.request.user
).distinct()
.distinct()
[Django-doc] 在此处是必需的,以防止多次检索相同的Profile
。
由于这是一个MessagesView
,您还可能应该返回Message
s,您将context_object_name
设置为msg
的事实也暗示了这一点。在这种情况下,您应该返回 QuerySet
的 Message
s,而不是 Profile
s:
class MessagesView(ListView):
model = Message
template_name = 'users/messages.html'
context_object_name = 'msg'
def get_queryset(self):
return Message.objects.filter(
user__user=self.request.user
)
如果您将ForeignKey
重命名为profile
,则使用profile__user=self.request.user
进行过滤。
注意:您可以将视图限制为基于类的视图,以便通过身份验证的用户使用
LoginRequiredMixin
mixin [Django-doc].
注意:通常使用
settings.AUTH_USER_MODEL
[Django-doc] 引用用户模型比直接使用User
model [Django-doc] 更好。更多信息可以查看referencing theUser
model section of the documentation。
【讨论】:
以上是关于Django ValueError:无法查询“用户”:必须是“个人资料”实例的主要内容,如果未能解决你的问题,请参考以下文章
ValueError:不能使用 None 作为查询值 django ajax
ValueError:无法引用参数值 <django.contrib.postgres.fields.jsonb.JsonAdapter
Django - Celery ValueError:无法解析相关模型 u'user.User'
Django ValueError:无法将字符串转换为浮点数