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 字段ForeignKeyProfile,而不是User(因此最好将该字段重命名为profile)。因此,这意味着像messages__user_id=self.request.user 这样的过滤没有多大意义。

您可以按照从ProfileUser 的关系进行过滤:

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,您还可能应该返回Messages,您将context_object_name 设置为msg 的事实也暗示了这一点。在这种情况下,您应该返回 QuerySetMessages,而不是 Profiles:

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 the User 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:无法将字符串转换为浮点数

尝试根据登录用户的用户名创建Model对象时的ValueError

ValueError: 运行测试时无法解析相关模型 u'app.model'