You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 16:57:02