Django objects.all () делает более 360 запросов - как я могу оптимизировать этот ManyToMany? - PullRequest
2 голосов
/ 30 апреля 2011

Впервые на Django, третий вопрос сегодня ...

У меня определены следующие (упрощенные) модели:

class Band(models.Model):
    bandname = models.CharField('Band name', max_length=300)

class Release(models.Model):
    title = models.CharField(max_length=300)
    artist = models.ManyToManyField('Band')
    formats = models.ManyToManyField('Format')

class Format(models.Model):
    kind = models.CharField(max_length=300)

class Song(models.Model):
    title = models.CharField(max_length=500)
    release = models.ForeignKey('Release')

(я удалил дополнительные поля для удобства чтения)

Теперь, когда я пытаюсь выполнить следующий запрос, он добавляет на страницу сотни дополнительных запросов:

s = Song.objects.all() # adds 367 queries

Я пытался изменить это на:

s = Song.objects.select_related('band', 'release').all() # adds 245 queries

Это все еще отстой, и я не знаю, что еще я могу сделать. В моей базе 122 песни, в 52 релизах 39 групп. Не уверен, поможет ли это, но я в растерянности.

Какие-нибудь советы о том, как это оптимизировать? Мне нужно показать группу и название релиза для каждого Song. A Release - это ManyToMany для Band, поскольку некоторые из них являются сплит-релизами нескольких артистов.

спасибо, Matt

1 Ответ

1 голос
/ 30 апреля 2011

Django select_related не следует отношениям «многие ко многим», и я предполагаю, что именно это вызывает большое количество запросов.

Я предлагаю использовать values() и double__underscore__notation для получения требуемых значений. Нечто подобное должно работать на django 1.3 и выше:

s = Song.objects.values('title', 'release__title', 'release__artist__bandname')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...