Фильтр запроса по первому элементу "многие-ко-многим

Я бы хотел, чтобы первый! артист для песни был из NL или BE. В настоящее время я запрашиваю всех исполнителей для песни. Вот мой запрос.

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()

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

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

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

Возвращается набор словарей с определенными значениями.

Вы пытаетесь получить первого исполнителя с кодом страны ['NL', 'BE']

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

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

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

Artist.objects.filter(country__code__in=['NL', 'BE'], song__name='My song').first()
Вернуться на верх