【问题标题】:The QuerySet value for an exact lookup must be limited to one result using slicing - Django精确查找的 QuerySet 值必须使用 slicing-Django 限制为一个结果
【发布时间】:2018-10-30 02:30:39
【问题描述】:

我正在建立一个新闻网站。虽然我试图获取具有相同标签的相关新闻列表。错误说:精确查找的 QuerySet 值必须限制为使用切片的一个结果- Django。

我有两个模型 News 和 Tag,Tag 是 News 的多对多外键。

新闻模型:

class News(models.Model):

    tag = models.ManyToManyField(Tag, blank=True, verbose_name='tag')

标签模型:

class Tag(models.Model):

    name = models.CharField(max_length=40)

查看:

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

有朋友可以帮忙吗?非常感谢!

【问题讨论】:

    标签: python django django-models django-views


    【解决方案1】:

    以下将起作用:

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

    【讨论】:

    • 您好,我发现了一个关于这个解决方案的小问题,相关新闻将包括主要新闻本身。我怎样才能获得除新闻本身之外的新闻相关新闻?非常感谢!
    • 太好了,要排除新闻本身,只需在末尾添加exclude().....exclude(id=news_pk) 这不包括来自relative_news 的新闻,其ID 作为参数传递或.....exclude(id=news.pk) 这不包括来自relative_news 的新闻及其ID
    • 非常感谢您的回复!因为我只需要6条相关新闻所以我的代码是这样的 relative_news = News.objects.filter(tag__id__in=news.tag.all())[:6 ] 在我添加 exclude(id=news_pk) 之后,它说:一旦获取切片,就无法过滤查询。你能给我进一步的解决方案吗?非常感谢!
    • 现在我正在使用一种方法来解决这个冲突,在我看来我使用:relative_news = News.objects.filter(tag__id__in=news.tag.all()).exclude(id=news_pk (
    • 在使用slice [:6]: News.objects.filter(tag__id__in=news.tag.all()).exclude(id=news_pk)[:6]之前,您必须对查询集使用exclude()
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      如果您在过滤器参数中使用查询集或列表,则会出现此错误。例如,

      News.objects.filter(title = a)
      

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

      【讨论】:

      • 是的,同意这个答案。刚刚将 field_name=queryset 更改为 field_name__in=queryset 并且对我有用。
      【解决方案4】:

      我也遇到了同样的问题,请尝试这样做,而不是:

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

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

      【讨论】:

        猜你喜欢
        • 2019-10-02
        • 2019-05-26
        • 2021-04-23
        • 1970-01-01
        • 2022-06-12
        • 2020-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多