值错误。无法分配查询集。它必须是一个实例

Posted

技术标签:

【中文标题】值错误。无法分配查询集。它必须是一个实例【英文标题】:Value Error. Cannot assign query set. It must be an instance 【发布时间】:2021-05-02 17:42:24 【问题描述】:

我想在我的评论模型中创建对象。 这是我对帖子的回复模型。

class Reply(MPTTModel):
    post = models.ForeignKey(Post, on_delete=models.CASCADE)

    detail = models.CharField(max_length=50, null=True, blank=True, unique=True)

    pub_date = models.DateTimeField(auto_now_add=True)
    last_edited = models.DateTimeField(auto_now=True)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    class MPTTMeta:
        order_insertion_by = ['name']

这是我的回复查看功能。

def post_detail(request,id,**kwargs):
    post = Post.objects.all().filter(id=id)
    comment = CommentReply.objects.filter(post=id)
    context = 'post': post, 'comment': comment
    if request.method == 'POST':
        comments = request.POST.get('comment')
        Reply.objects.create(
                post=post, detail=comments, author = request.user)
    else:
        return render(request, 'khalidblog_app/full_detail.html', context)

    return render(request,'khalidblog_app/full_detail.html',context)

我在我的模板中使用 for 循环:

% for post in post %
    <img alt='' src=' post.image.url ' class='avatar avatar-80 photo' height='80' width='80' />
    <div class="eltd-author-description-text-holder">
        <h5 class="eltd-author-name"> post.author </h5>
    <div class="eltd-author-text">
        <p>post.title</p>
    </div>
    <div class="eltd-author-text">
        <p>post.content</p>
        <hr>
    </div>
%endfor%

当我运行这个视图函数时,它显示一个值错误,如下所示。

Cannot assign "<QuerySet [<Post: Author : zorainTiTleFirst PostDated :2021-01-17 16:27:47.043869+00:00>]>": "Reply.post" must be a "Post" instance.

如何使用此视图功能在此回复模型中设置 forignkey(Post)?

【问题讨论】:

更改这一行: post = Post.objects.all().filter(id=id) 为 post = Post.objects.filter(id=id).first() 它将返回第一个对象在过滤器中。如果你像这样使用 get:post = Post.objects.get(id=id),如果对象不存在,它会引发异常。你也可以这样做:post = Post.objects.filter(id=id)[0] 【参考方案1】:

您的“post”变量指向 Post 对象的 QuerySet,而不是单个实例。您应该使用 get() 而不是 filter(),如下所示:

post = Post.objects.get(id=id)

更新:您在 cmets 中分享了您在模板中使用 for 循环。 for 循环设计用于迭代一组对象(例如,使用 filter() 返回的 QuerySet)。如果只想渲染单个实例的字段值,则不需要使用 for 循环。

Here 是指向 Django 文档的链接,用于 filter() - 它返回一个 QuerySet(对象组)。

Here 是指向 Django 文档的链接,用于 get() - 它返回单个对象。

【讨论】:

这与您的问题无关,但是,视图中不需要您的 else: 语句。这个 else 语句中的 return 调用是下面 return 调用的重复,无论如何都会被执行。 当我尝试 .get 时,它说 post 对象不可迭代。所以这意味着我让你使用另一个变量来创建对象。如下... post1 =Post.objects.get(id=id) Reply.objects.create(post=post1, detail=cmets, author = request.user) 听起来您提到的第二个错误可能与您的 HTML 模板中的代码有关。请问你也可以分享这个吗?也许您正在使用 for 循环,例如 for something in post,这是没有意义的。 是的,我正在使用 for 循环。 % for post in post %
post.author
post.title

post.content


%endfor%
如果我不使用 for 那么它不会显示帖子。【参考方案2】:

在函数的第一行,您正在使用 .filter() 方法,该方法返回 QuerySet(简称对象列表),您应该在理想情况下使用 .get() 方法。 .get() 返回第 6 行的赋值实际期望的单个对象。

【讨论】:

当我尝试 .get 时,它说 post 对象不可迭代。所以这意味着我让你使用另一个变量来创建对象。如下... post1 =Post.objects.get(id=id) Reply.objects.create(post=post1, detail=cmets, author = request.user)【参考方案3】:

由于您的“post”变量指向 Post 对象的 QuerySet,您可以像这样直接选择 QuerySet 中的第一个元素:

 Reply.objects.create(
                post=post[0], detail=comments, author = request.user)

【讨论】:

cmets中已经提到过这个解决方案 是的,先生,我知道了。

以上是关于值错误。无法分配查询集。它必须是一个实例的主要内容,如果未能解决你的问题,请参考以下文章

Django错误。插入表时不能分配必须是实例

必须使用 GeoLocation 类型的封闭实例来限定分配

Django 错误。不能分配必须是实例

过滤后如何将分配的属性保留给查询集对象?备择方案?

django - 无法分配外键

Django 迁移失败 - 无法查询“peterson”:必须是“用户”实例