Dados estes modelos:
class Format(models.Model):
name = models.CharField(unique=True)
# More fields...
class Release(models.Model):
formats = models.ManyToManyField(Format, blank=True)
# More fields...
Quando tenho um conjunto de consultas de Releases (por exemplo, por meio de releases = Release.objects.filter(foo='bar')
), como obtenho uma lista dos formatos nesse conjunto de consultas, como objetos e distintos?
Nenhuma das seguintes opções consegue isso:
# 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']
A única maneira que consigo pensar é criar manualmente uma lista percorrendo os IDs, verificando se ela já existe na lista e, se não, adicionando-a com formats.append(Format.objects.get(id=the_id))
, mas eu realmente gostaria de evitar fazer isso, se possível.
Consulta ao contrário:
uma vantagem extra é que esses são
Format
objetos, então com todos os campos e métodos que você definiu noFormat
modelo "incluídos".