Если я правильно вас понимаю, вы хотите, чтобы все треки имели жанр "Rock" или жанр, в котором "Rock" является родителем.Если так:
from django.db.models import Q
Track.objects.filter(Q(genre__genre='Rock') | Q(genre__parent__genre='Rock')).distinct()
РЕДАКТИРОВАТЬ
На самом деле, после повторного прочтения вопроса кажется, что вы хотите, что я сказал, но вместо списка жанров вместе, вместотолько по одному за раз.Для этого вам просто нужно настроить приведенный выше код, например:
Track.objects.filter(Q(genre__genre__in=['Rock', 'Pop']) | Q(genre__parent__genre__in=['Rock', 'Pop'])).distinct()
ОБНОВЛЕНИЕ
А, тогда это немного сложнее, но все же выполнимо.
has_rock_genres = Q(genre__genre='Rock') | Q(genre__parent__genre='Rock')
has_pop_genres = Q(genre__genre='Pop') | Q(genre__parent__genre='Pop')
Track.objects.filter(has_rock_genres & has_pop_genres).distinct()
Вы можете сделать это все в одной строке, но код становится немного беспорядочным в этот момент.
ОБНОВЛЕНИЕ
Действительно, давая мнеумственная тренировка сегодня, не так ли?;)
Вам нужно будет сделать что-то вроде:
query = None
for genre in genres:
if query is None:
query = Q(genre__genre=genre) | Q(genre__parent__genre=genre)
else:
query = query & (Q(genre__genre=genre) | Q(genre__parent__genre=genre))
Track.objects.filter(query).distinct()