python - Django:返回属于特定模型的多对多关系的不同集合
问题描述
我想要一个返回属于模型 A 中所有条目的所有不同标签的查询。我怀疑通过巧妙的查询和一些过滤是可能的,但我无法解决。我想尽量减少数据库命中。
楷模:
class Tag(models.Model):
name = models.CharField(max_length = 50,)
category = models.CharField(max_length = 50, blank=True)
class A(models.Model):
...
tags = models.ManyToManyField(Tag, blank=True)
class B(models.Model):
...
tags = models.ManyToManyField(Tag, blank=True)
在此期间我的解决方案是:
tags = list()
for a in A.objects.all():
for t in a.tags.all():
if t not in tags:
tags.append(t)
是否有一个优雅的解决方案来实现上述功能?
解决方案
Tag.objects.filter(a__isnull=false).distinct()
应该这样做。
这在这里并不最终相关,因为数据库将能够为您完成(我可能记错了上面的一些语法,但如果是这样,它将是可纠正的,这在单个查询中肯定是可行的)但是如果您在在您对不在数据库中的数据进行操作的情况下,您最好使用tags = set()
而不是tags = list()
- 它会为您管理唯一性,并且比重复测试列表中的成员身份更有效。例如:
tags = set()
for a in some_iterable:
for t in a.some_function():
tags.add(t)
这可以浓缩成一个嵌套的生成器表达式,这会更快一些 - 但使用set
而不是list
关键的变化,所以我保持它与您最初的尝试相似。嵌套的生成器表达式看起来像:
tags = set(t for a in some_iterable for t in a.some_function())
而且,如果您不打算进一步修改tags
,frozenset(t for a in ...)
那么养成一个好习惯。
推荐阅读
- android - Glide 无法加载这种类型的 url 图片
- php - 在 Woocommerce 单个产品页面中显示特定产品标签的自定义内容
- r - 如何将 sf 导入包以运行依赖于 lwgeom 的函数?
- python - 将环境变量添加到主文件后单元测试失败
- arrays - 我的程序无法识别字母数组中的字母
- php - 如何确定行是否等于特定输入
- python - 使用自定义比较函数按多列对熊猫数据框进行排序
- mysql - 将 SQL 查询转换为 JPQL 查询 - 总和具有特定文本值的属性数
- django - django.core.exceptions.ImproperlyConfigured:您正在使用 staticfiles 应用程序而没有将 STATIC_ROOT 设置设置为文件系统路径。错误
- python - 尝试执行完整操作,尽管有错误