最小化来自django查询的mysql数据库命中

时间:2010-11-07 16:39:36

标签: django mysql django-templates many-to-many

我在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字段和我试图用Source执行的“反向select_related”。

因此初始数据拉动一次 引用Actor命中一次
引用Association_objects命中一次 引用源命中一次

总的来说,有没有办法减少数据库命中?具体来说,有没有更好的方法来提取多对多关系而不创建更多的同步数据库查询?

1 个答案:

答案 0 :(得分:0)

如果您要在AssociationSource之间使用ForeignKey关系,则可以取消select_related和{{1}}的查找。然后{{1}}也可以提取这些内容。

如果您真的非常关心优化ManyToManyField,我建议缓存查找结果。