Фильтр запроса по первому элементу "многие-ко-многим
Я бы хотел, чтобы первый! артист для песни был из 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()