值错误。无法分配查询集。它必须是一个实例
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.titlepost.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中已经提到过这个解决方案 是的,先生,我知道了。以上是关于值错误。无法分配查询集。它必须是一个实例的主要内容,如果未能解决你的问题,请参考以下文章