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