Минимизируйте обращения к базе данных MySQL из запроса Django. - PullRequest
0 голосов
/ 07 ноября 2010

Я делаю запрос в django, который в итоге попадает в базу данных 4 раза. Я хочу быть уверен, что нет более эффективного способа извлечения данных, чем я уже делаю.

У меня есть модель:

class Film(models.Model):
   studio = models.ForeignKey(Studio)
   name = models.CharField(max_length=30)
   rating = models.ForeignKey(Rating)
   actor = models.ManyToManyField('Actor', blank=True, related_name='actor', db_table=u'moviedb_film_actor')
   staff = models.ManyToManyField(Staff, blank=True, through='Association')

Мой взгляд здесь:

def film_by_id(request, id):

   # Look up the car name (and raise a 404 if it can't be found).
   object = get_object_or_404(film.objects.select_related(), id__iexact=id)

   template_name = 'Film_by_id.html',

   association_objects = Association.objects.select_related(depth=1).filter(Q(film__name=object.name))
   source_objects = Source.objects.filter(film__name=object.name)

   object.association_objects = association_objects
   object.trim_objects = trim_objects

   return render_to_response(
        template_name,
        {"object" : object},
        context_instance = RequestContext(request))

И, наконец, мой шаблон:

Make: {{ object.studio }}<br>
Rating: {{ object.rating }}<br><br>

<u>--Actors--</u><br>
{% for actor in object.actor.all %}
    {{ actor.name }}<br>
{% endfor %}
<br>

<u>--Staff--</u><br>
{% for item in object.association_objects %}
    {{ item.staff.name }} - {{ item.get_type_display }}<br>
{% endfor %}

<u>--Source--</u><br>
<ul>
{% for item in object.source_objects %}
    <li>{{ item }}
{% endfor %}
</ul>

Панель инструментов отладки показывает, что я попал в базу данных 4 раза. Проблема заключается в полях ManytoMany и "reverse select_related", которые я пытаюсь выполнить с помощью Source.

Итак, первоначальное извлечение данных происходит один раз
Ссылочный актер наносит удар один раз
Ссылка на объект Association_objects попадает один раз
Ссылка на источник бьет один раз

Итак, есть ли способ уменьшить попадания в базу данных? В частности, есть ли лучший способ получить отношения многие ко многим, не создавая больше одновременных запросов к базе данных?

1 Ответ

0 голосов
/ 07 ноября 2010

Вы могли бы исключить поиски для Association и Source, если бы между ними использовались отношения ForeignKey.Тогда select_related может их также потянуть.

Если вы действительно, глубоко заботитесь об оптимизации ManyToManyField, я бы предложил кэшировать результат поиска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...