У меня есть запрос, содержащий некоторые объекты. В зависимости от некоторых случаев или другого я теперь хочу, чтобы исключить все объекты без определенных тегов (_tags этого имя TagField на моей модели):Как искать объекты без определенных тегов?
self.queryset=self.queryset.exclude(_tags__id__in=avoid)
Но это только оставляет меня с ошибкой:
Caught FieldError while rendering:
Join on field '_tags' not permitted.
Did you misspell 'id' for the lookup type?
Как я уверен, я не пропустил 'id', я сделал несколько попыток использовать теги для чего-то вроде этого. В документах много о пользовательских менеджерах, но почему-то я просто не могу понять, как я могу их использовать, чтобы получить то, что хочу.
редактировать:
исправленный код выше
self.queryset=self.queryset.exclude(_tags__in=avoid)
где избегают список целых чисел. И это оставляет мне проблему с тем, что TagField django-tagging - это просто специальный CharField (или TextField?). Который, конечно, не будет разбираться, если я просто запрошу его против списка целых чисел. Я мог бы попытаться решить эту проблему таким образом, как это:
for tag in avoid:
self.queryset=self.queryset.exclude(_tags__contains=tag.name)
, который не только некрасиво, но и оставляет меня с проблемой тегов из нескольких слов или соответствующих частей других тегов.
У меня как-то есть подозрение, что это может быть решено гораздо красивее тем, кто понял, как работает джанго-тегирование.
Также вы не можете получить доступ к полю _tags непосредственно в шаблоне. Имена полей, начинающиеся с подчеркивания, не допускаются. Я бы рекомендовал не начинать имя с подчеркивания – Mikael
Спасибо за ваш быстрый ответ. Вы были абсолютно правы в аргументах запроса, но это не решает мою проблему. _tags вызывается так, как это происходит потому, что на модели есть свойство, называемое тегами, к которым гораздо проще получить доступ из шаблона;) – marue