精确查找的QuerySet值必须使用分片限制为一个结果- Django

xggvc2p6  于 2023-02-05  发布在  Go
关注(0)|答案(6)|浏览(147)

我正在建立一个新闻网站。当我试图获得具有相同标签的相关新闻列表时。错误如下:
精确查找的QuerySet值必须使用切片限制为一个结果。
我有两个模型NewsTag,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
    })
vfhzx4xs

vfhzx4xs1#

以下方法有效:

def newsDetailView(request, news_pk):
    news = get_object_or_404(News, id=news_pk)
    relative_news = News.objects.filter(tag__id__in=news.tag.all())
7gyucuyw

7gyucuyw2#

一般来说,当我们在django模型对象的位置使用模型查询集时会发生这个错误。在给定的问题中,你也做了同样的事情。“Objects.filter”返回模型查询集,可以有一个或多个django模型对象,但“objects.get”返回单个django模型对象。或者我们可以在“objects.filter”中使用.last()和.first()。

njthzxwz

njthzxwz3#

如果在筛选参数中使用queryset或list,则会出现此错误。例如,

News.objects.filter(title = a)

这里,如果过滤器中的“a”是查询集或列表,则会引发此错误。

af7jpaap

af7jpaap4#

您所面临的问题是,您首先以过滤器查询集(来自数据库的对象集合)为例:Book.objects.filter(subject='fiction')),然后尝试使用该过滤器作为参数(如前一个中的subject = 'fiction')来获取另一个过滤器查询集。
相反,您必须使用一个使用“get”而不是“filter”的对象,而前面的示例将变成

book = Book.objects.get(subject='fiction')

然后使用该对象作为下一个过滤器的参数。

example: Book_shelf = BookShelf.objects.filter(book = book)
ao218c7q

ao218c7q5#

我也遇到过同样的问题,请尝试执行此操作,而不是:
relative_news = News.objects.filter(tag=tags)

relative_news = News.objects.filter(tag=tags).first()

anauzrmj

anauzrmj6#

我得到了下面相同的错误:
ValueError:精确查找的QuerySet值必须使用切片限制为一个结果。
因为我将filter()生成的查询集赋值给category,如下所示:

# Here                   # Here                 
Product.objects.filter(category=Category.objects.filter(pk=1))

因此,我在category后面放入__,如下所示,然后错误就解决了:

# ↓ Here
Product.objects.filter(category__in=Category.objects.filter(pk=1))

或者,我将get()生成的对象赋值给category,如下所示,然后错误就解决了:

# Here                 
Product.objects.filter(category=Category.objects.get(pk=1))

相关问题