我正在建立一个新闻网站。当我试图获得具有相同标签的相关新闻列表时。错误如下:
精确查找的QuerySet值必须使用切片限制为一个结果。
我有两个模型News
和Tag
,Tag是News
的多对多外键。
# "models.py"
class Tag(models.Model):
name = models.CharField(max_length=40)
class News(models.Model):
tag = models.ManyToManyField(Tag, blank=True, verbose_name='tag')
查看:
def newsDetailView(request, news_pk):
news = get_object_or_404(News, id=news_pk)
tags = news.tag.annotate(news_count=Count('news'))
relative_news = News.objects.filter(tag=tags)
return render(request, "news_detail.html", {
'news': news,
'tags': tags,
'relative_news': relative_news
})
6条答案
按热度按时间vfhzx4xs1#
以下方法有效:
7gyucuyw2#
一般来说,当我们在django模型对象的位置使用模型查询集时会发生这个错误。在给定的问题中,你也做了同样的事情。“Objects.filter”返回模型查询集,可以有一个或多个django模型对象,但“objects.get”返回单个django模型对象。或者我们可以在“objects.filter”中使用.last()和.first()。
njthzxwz3#
如果在筛选参数中使用queryset或list,则会出现此错误。例如,
这里,如果过滤器中的“a”是查询集或列表,则会引发此错误。
af7jpaap4#
您所面临的问题是,您首先以过滤器查询集(来自数据库的对象集合)为例:
Book.objects.filter(subject='fiction')
),然后尝试使用该过滤器作为参数(如前一个中的subject = 'fiction')来获取另一个过滤器查询集。相反,您必须使用一个使用“get”而不是“filter”的对象,而前面的示例将变成
然后使用该对象作为下一个过滤器的参数。
ao218c7q5#
我也遇到过同样的问题,请尝试执行此操作,而不是:
relative_news = News.objects.filter(tag=tags)
到
relative_news = News.objects.filter(tag=tags).first()
anauzrmj6#
我得到了下面相同的错误:
ValueError:精确查找的QuerySet值必须使用切片限制为一个结果。
因为我将filter()生成的查询集赋值给
category
,如下所示:因此,我在
category
后面放入__,如下所示,然后错误就解决了:或者,我将get()生成的对象赋值给
category
,如下所示,然后错误就解决了: