python - 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>]>
有可能这样做吗?
解决方案
是的,您可以使用标签名称注释钱包,因此:
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')
这基本上就是可迭代解包的作用。
推荐阅读
- opencv - 为什么使用幅度方法来获取处理后的图像?
- angularjs - AngularJS 多步表单全局验证
- php - 获取 PHP cURL 请求的可用网络接口
- xamarin.ios - Xamarin iOS 中的 UITextContentType.OneTimeCode
- spring - localhost:8080/greeting 没有响应
- python-3.x - Python:使用in_place模块根据另一个文本文件中的文本更新文本文件中的多个单词
- amazon-web-services - 如何让 kubectl 登录 AWS EKS 集群?
- asp.net-core - 部署在 debian 上的自包含 asp.net-core 无法启动并且不显示错误消息
- angular - D3 Angular - 轴标签中的换行符
- laravel - 在 Ubuntu 18.08 (Laravel/Homestead) 上设置通配符子域