首页 > 解决方案 > Django-taggit - 如何过滤所有标记的对象,为每个标记重复它们?

问题描述

我需要选择所有标记的对象,以便为标记在它们上面的每个标记重复它们。

例如:

class Wallet(BaseModel):
    code = models.CharField(max_length=85, verbose_name="Wallet")
    tags = TaggableManager(blank=True)

    def __str__(self):
        return f"{self.code}"

然后,如果我运行以下代码:

wallet_1 = Wallet.objects.create(code=1)
wallet_1.tags.add(*["A", "B"])
wallet_2 = Wallet.objects.create(code=2)
wallet_2.tags.add(*["C"])

我需要选择所有钱包,以便如果 wallet_1 有两个标签,则选择应该返回 wallet_1 两次,因此结果将是一个包含以下内容的查询集:

<QuerySet [<Wallet: 1>, <Wallet: 1>, <Wallet: 2>]>

有可能这样做吗?

标签: pythondjangotagging

解决方案


是的,您可以使用标签名称注释钱包,因此:

from django.db.models import F

Wallet.objects.annotate(
    tag_name=F('tags__name')
)

您可以过滤Wallet没有标签的s:

from django.db.models import F

Wallet.objects.filter(
    tags__isnull=False
).annotate(
    tag_name=F('tags__name')
)

由此Wallet产生的对象将具有指定标签名称QuerySet的额外属性。.tag_name所以wallet_1会发生两次,每个钱包都有不同的值.tag_name

注意这里不需要使用iterable unpacking,可以简单的写:

wallet_1 = Wallet.objects.create(code=1)
wallet_1.tags.add('A', 'B')
wallet_2 = Wallet.objects.create(code=2)
wallet_2.tags.add('C')

这基本上就是可迭代解包的作用。


推荐阅读