Запрос фильтра по первому элементу «многие ко многим»

#django #django-queryset

Вопрос:

Я бы хотел первый! исполнитель для песни, которая должна быть из NL или БЫТЬ. В данный момент я запрашиваю у всех исполнителей песню. Это мой вопрос.

 Song.objects.filter(artists__country__code__in=['NL', 'BE'])
 

а это мои модели:

 class Song(Timestamps):
    uuid = models.UUIDField('UUID', unique=True)
    name = models.CharField('Name', max_length=255, blank=True)
    artists = models.ManyToManyField(Artist)
    ...

class Artist(Timestamps):
    uuid = models.UUIDField('UUID', unique=True)
    name = models.CharField('Name', max_length=255, blank=True)
    country = CountryField(blank=True, null=True)
    ...
 

Я знаю, что могу получить доступ к первому элементу поля «многие ко многим», как это:

 song.artists.first()
 

Но я не знаю, как это сделать в фильтре запросов.
Есть какие-нибудь идеи?
Заранее спасибо.

Ответ №1:

Насколько я правильно понимаю вопрос, вам нужен первый исполнитель для каждой песни, так как в одной песне может быть несколько исполнителей. Мое решение может быть не лучшим, потому что оно просто возвращает значения объектов, но, возможно, оно поможет.

 Song.objects.filter(artists__country__code__in=['NL', 'BE']).values("uuid", "name", "artists__name", "artists_uuid")
 

Это вернет набор запросов к справочникам с определенными значениями.

Ответ №2:

То, что вы пытаетесь сделать, — это получить первого исполнителя с кодом страны [«NL», «BE»]

Используйте что-то вроде этого

 Song.objects.filter(artists__country__code__in=['NL', 'BE']).first().artists.first()
 

Ответ №3:

Похоже, вам нужен первый исполнитель, связанный с песней, принадлежащей указанным странам. Я думаю, что вы можете запросить саму Artist модель и указать соответствующую песню.

 Artist.objects.filter(country__code__in=['NL', 'BE'], song__name='My song').first()