如何从Release查询集中获取去重的Format多对关联对象?
获取Release查询集中去重的Format对象
给定Django模型:
class Format(models.Model): name = models.CharField(unique=True) # 更多字段... class Release(models.Model): formats = models.ManyToManyField(Format, blank=True) # 更多字段...
当通过releases = Release.objects.filter(foo='bar')获取到Release查询集后,需要从中提取所有去重的Format对象。以下两种尝试均无法满足需求:
# 生成包含ID的字典列表,未去重,示例:[ { 'formats': 1 }, { 'formats': 2 }, { 'formats': 1 } ] formats = releases.values('formats')
# 生成ID列表,未去重,示例:[ 1, 2, 1 ] formats = releases.aggregate(arr=ArrayAgg('platforms'))['arr']
推荐解决方案
方式一:反向关联查询(高效单查询)
直接从Format模型出发,过滤关联的Release属于目标查询集,最后用distinct()去重(避免同一个Format因关联多个符合条件的Release而重复出现):
unique_formats = Format.objects.filter(release__in=releases).distinct()
方式二:带去重的聚合查询
如果需要先获取去重的Format ID列表,再查询对象,可以使用ArrayAgg的distinct=True参数:
from django.db.models import ArrayAgg # 获取去重的Format ID列表 format_ids = releases.aggregate(arr=ArrayAgg('formats', distinct=True))['arr'] # 通过ID查询去重后的Format对象 unique_formats = Format.objects.filter(id__in=format_ids)
内容的提问来源于stack exchange,提问作者bur
相关产品推荐
相关产品推荐

