Как улучшить запрос для исключения ссылающихся объектов внутри запроса (mptt-модель)?
У меня есть следующий код, где каждый Song
может иметь Part
s и каждая часть может иметь несколько Genre
s назначенных.
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)
)
)
Есть ли способ улучшить этот запрос? Является ли это лучшим способом достижения цели?
Любая помощь будет высоко оценена!