Мне интересно, как запросить несколько тегов через taggit.В настоящее время я использую django-taggit.Я использую пиццу в качестве имени заполнителя.Как я могу фильтровать таким образом, чтобы возвращались только объекты, которые содержат 2 или более тегов?Например, если я хочу запросить пиццу разных типов:
>>> Pizza.objects.create(name='Pizza 1', tags=[pepperoni])
>>> Pizza.objects.create(name='Pizza 2', tags=[pepperoni, chicken, onions])
>>> Pizza.objects.create(name='Pizza 3', tags=[pepperoni, sausage, cheese, onions])
>>> Pizza.objects.filter(tags__contains=['pepperoni', 'onions'])
<QuerySet [<Pizza: Pizza 2>, <Pizza: Pizza 3> ]>
Вот текущая реализация django-taggit.Он запрашивает теги отдельно, но часто мои объекты будут использовать 1 тег, а не 2 тега.Я хотел бы запросить, если присутствуют 2 или более тегов.
models.py
class UUIDTaggedItem(GenericUUIDTaggedItemBase, TaggedItemBase):
class Meta:
verbose_name = _("Tag")
verbose_name_plural = _("Tags")
class Pizza(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
tags = TaggableManager(blank=True, through=UUIDTaggedItem)
filters.py
class TagsFilter(CharFilter):
def filter(self, qs, value):
if value:
tags = [tag.strip() for tag in value.split(',')]
qs = qs.filter(tags__name__in=tags).distinct()
return qs
class PizzaFilter(filterset.FilterSet):
tags = TagsFilter(field_name="tags", lookup_expr='icontains')
class Meta:
model = Pizza
Я также использую postgres в качестве своей базы данных, я рассмотрел вопрос об использовании ArrayField, но я прочитал вопросы о переполнении стека, которые не предлагают использовать ArrayField для тегов.