鉴于这些模型:
class Format(models.Model):
name = models.CharField(unique=True)
# More fields...
class Release(models.Model):
formats = models.ManyToManyField(Format, blank=True)
# More fields...
当我有一个 Releases 查询集(例如通过releases = Release.objects.filter(foo='bar')
)时,如何获取该查询集中的格式列表(作为对象和不同格式)?
以下两种方法都无法实现此目的:
# produces a list of dicts with IDs, not distinct e.g. [ { 'formats': 1 }, { 'formats': 2 }, { 'formats': 1 } ]:
formats = releases.values('formats')
# produces a list of IDs, not distinct, e.g. [ 1, 2, 1 ]:
formats = releases.aggregate(arr=ArrayAgg('platforms'))['arr']
我能想到的唯一方法是通过循环 ID 手动创建一个列表,检查它是否已经存在于列表中,如果不存在就添加它formats.append(Format.objects.get(id=the_id))
,但如果可能的话,我真的想避免这样做。
反向查询:
一个额外的优点是这些都是
Format
对象,因此包含在模型上定义的所有字段和方法Format
。