Получение списка отдельных объектов ManyToManyField
Учитывая эти модели:
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')
), как мне получить список форматов в этом наборе запросов, как объекты и distinct?
Ни один из следующих способов не достигает этого:
# 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']
Единственный способ, который я могу придумать, - это вручную создать список, перебирая идентификаторы, проверяя, существует ли он уже в списке, и если нет, добавить его с помощью formats.append(Format.objects.get(id=the_id))
, но я бы очень хотел избежать этого, если возможно.
Запрос в обратном порядке:
Format.objects.filter(release__foo='bar').distinct()
дополнительным преимуществом является то, что это объекты Format
, поэтому все поля и методы, которые вы определили в модели Format
, "включены".