Django-taggit查询对象,如果标签字段包含2个或更多元素?

时间:2018-12-23 15:30:42

标签: python django django-taggit

我想知道如何通过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进行标记。

0 个答案:

没有答案