Получение списка отдельных объектов 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, "включены".

Вернуться на верх