Django taggit 视图导致 FieldError:相关字段查找无效:名称

问题描述 投票:0回答:1

标签视图会导致此错误消息。

FieldError: Related Field got invalid lookup: name
表示 Django ORM 对标签关系的查询期望与实际执行的查询之间不匹配。

[...]
 File "/workspace/Coach-Matrix/main_forum/views/filters.py", line 18, in get_queryset
    return Question.objects.filter(tags__name=tag.name)
  File "/workspace/.pip-modules/lib/python3.9/site-packages/django/db/models/manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/workspace/.pip-modules/lib/python3.9/site-packages/django/db/models/query.py", line 1420, in filter
    return self._filter_or_exclude(False, args, kwargs)
  File "/workspace/.pip-modules/lib/python3.9/site-packages/django/db/models/query.py", line 1438, in _filter_or_exclude
    clone._filter_or_exclude_inplace(negate, args, kwargs)
  File "/workspace/.pip-modules/lib/python3.9/site-packages/django/db/models/query.py", line 1445, in _filter_or_exclude_inplace
    self._query.add_q(Q(*args, **kwargs))
  File "/workspace/.pip-modules/lib/python3.9/site-packages/django/db/models/sql/query.py", line 1532, in add_q
    clause, _ = self._add_q(q_object, self.used_aliases)
  File "/workspace/.pip-modules/lib/python3.9/site-packages/django/db/models/sql/query.py", line 1562, in _add_q
    child_clause, needed_inner = self.build_filter(
  File "/workspace/.pip-modules/lib/python3.9/site-packages/django/db/models/sql/query.py", line 1478, in build_filter
    condition = self.build_lookup(lookups, col, value)
  File "/workspace/.pip-modules/lib/python3.9/site-packages/django/db/models/sql/query.py", line 1292, in build_lookup
    raise FieldError(

Exception Type: FieldError at /questions/tag/tag4/
Exception Value: Related Field got invalid lookup: name

我尝试过使用其 slug 获取 Tag 实例并使用获取的 Tag 实例的名称来过滤 Question 对象。

from django.views.generic.list import ListView
from ..models import Question
from django.shortcuts import get_object_or_404
from taggit.models import Tag

class FilterByTagView(ListView):
    model = Question
    template_name = 'filtered_questions.html'
    context_object_name = 'questions'

    def get_queryset(self):
        tag_slug = self.kwargs.get('tag_slug')
        # Retrieve the Tag object by slug
        tag = get_object_or_404(Tag, slug=tag_slug)
        # Use TaggedItemManager's filter method to get questions tagged with the retrieved tag
        return Question.objects.filter(tags__slug=tag.slug)

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        tag_slug = self.kwargs.get('tag_slug')
        context['tag'] = get_object_or_404(Tag, slug=tag_slug)
        return context
python django django-views django-queryset django-taggit
1个回答
0
投票

出现错误是因为 Django

filter()
方法与
tags__name
一起使用,这不是对
django-taggit
建立的标签关系的有效查找。

django-taggit 不直接在模型上存储标签,而是使用直通模型将标签与对象关联起来。这意味着您不能在

tags__name
调用中直接使用
tags__slug
filter()
,至少在大多数明显的情况下是如此。

这种方法被证实是有效的,它涉及使用 taggit 的 TaggedItem 模型来查找带有特定标签的所有项目,然后基于此过滤 Question 对象:

from django.views.generic.list import ListView
from ..models import Question
from django.shortcuts import get_object_or_404
from taggit.models import Tag, TaggedItem # added Taggeditem to find all items tagged with a specific tag

class FilterByTagView(ListView):
    model = Question
    template_name = 'filtered_questions.html'
    context_object_name = 'questions'

    def get_queryset(self):
        tag_slug = self.kwargs.get('tag_slug')
        tag = get_object_or_404(Tag, slug=tag_slug)

        # Use TaggedItem to query all items associated with the tag:
        questions_ids = TaggedItem.objects.filter(tag_id=tag.id).values_list('object_id', flat=True)

        return Question.objects.filter(id__in=questions_ids) # return id in question_id's

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        tag_slug = self.kwargs.get('tag_slug')
        context['tag'] = get_object_or_404(Tag, slug=tag_slug)
        return context
© www.soinside.com 2019 - 2024. All rights reserved.