Как улучшить запрос для исключения ссылающихся объектов внутри запроса (mptt-модель)?

У меня есть следующий код, где каждый Song может иметь Parts и каждая часть может иметь несколько Genres назначенных.

from model_utils.models import TimeFramedModel
from django.db import models
from mptt.models import MPTTModel, TreeForeignKey
from mptt.fields import TreeManyToManyField
from django.db.models import Prefetch


class Song(models.Model):
    name = models.CharField(max_length=50)

    def __str__(self):
        return self.name


class Genre(MPTTModel):
    name = models.CharField(max_length=50, unique=True)
    parent = TreeForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='children')

    class MPTTMeta:
        order_insertion_by = ['name']
        

class Part(TimeFramedModel):
    # start and end fields via inheritance
    song = models.ForeignKey(Song, related_name="parts", on_delete=models.CASCADE)
    genres = TreeManyToManyField(Genre)
    desc = models.TextField()

    def __str__(self):
        return self.start

Я пытаюсь написать запрос:
Ввод: Набор Genre.ids имен in_genres
. Выход: Набор запросов, содержащий Song, которые имеют Part входной Genre.ids, а все остальные Part исключены.

Мой текущий запрос:

for genre_id in in_genres:
    genre = Genre.objects.get(pk=genre_id)
    qs = Song.objects.filter(parts__genres__in=genre.get_descendants(include_self=True)).prefetch_related(
        Prefetch(
            'parts',
            Part.objects.filter(genres__in=genre.get_descendants(include_self=True)
        )
    )

Есть ли способ улучшить этот запрос? Является ли это лучшим способом достижения цели?

Любая помощь будет высоко оценена!

Вернуться на верх