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

时间:2021-01-28 19:08:00

标签: python django django-queryset valueerror

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

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)?

3 个答案:

答案 0 :(得分:1)

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

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

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

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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