Объекты запроса Django-taggit, если поле тега содержит 2 или более элементов? - PullRequest
0 голосов
/ 23 декабря 2018

Мне интересно, как запросить несколько тегов через 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 для тегов.

...