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

Django: The QuerySet value for an exact lookup must be limited to one result using slicing

我正在尝试使用 slug url 访问页面,但我一直收到此错误 The QuerySet value for an exact lookup must be limited to one result using slicing. 我认为这将是 filterget 错误在我看来,但我不知道错误来自哪里

view.py

def tutorial_topic_category(request, slug):
    tutorial_category = TutorialCategory.objects.get(slug=slug)
    tutorial_topic_category = TutorialTopicCategory.objects.filter(tutorial_category=tutorial_category)

    context = {
        'tutorial_topic_category': tutorial_topic_category,
    }
    return render(request, 'tutorials/tutorial_topic_category.html', context)

def topic(request, slug, slug2):
    tutorial_category = TutorialCategory.objects.get(slug=slug)
    tutorial_topic_category = TutorialTopicCategory.objects.filter(tutorial_category=tutorial_category)

    topic = Topic.objects.get(slug=slug2, tutorial_topic_category=tutorial_topic_category)

    context = {
        'topic': topic,
    }
    return render(request, 'tutorials/topic.html', context)

urls.py

path("<slug>", views.tutorial_topic_category, name='tutorial-topic-category'),
path("<slug>/<slug2>", views.topic, name='topic')

以及我如何使用 Django 模板标签在我的模板中传递 slug

<a href="{% url 'tutorials:topic' category.slug category.slug2  %}">

在您的主题视图中,您正在使用过滤器来获取教程主题类别。这 returns 是一个查询集,而不是单个项目。然后当您使用它来获取 'topic' 时,您是基于此集合而不是单个等效项进行查询,从而引发错误。所以,相反,只使用第一个过滤集你可以说

topic = Topic.objects.get(slug=slug2, tutorial_topic_category=tutorial_topic_category[0])

...或者,如果您只想使用全套,即使您只寻找一件商品

topic = Topic.objects.get(slug=slug2, tutorial_topic_category__in = tutorial_topic_category)

您可能还需要调整 URL,使 slug2 来自主题 slug,因为这是将用于定位实例的模型:

<a href="{% url 'tutorials:topic' category.slug topic.slug2  %}">