Django 如何减少数据库查询?
型号: 观点:Django 如何减少数据库查询?,django,django-queryset,Django,Django Queryset,型号: 观点: class Technology(models.Model): name = models.CharField(max_length=100, unique=True) slug = models.SlugField(max_length=100, unique=True) class Site(models.Model): name = models.CharField(max_length=100, unique=True) slug = m
class Technology(models.Model):
name = models.CharField(max_length=100, unique=True)
slug = models.SlugField(max_length=100, unique=True)
class Site(models.Model):
name = models.CharField(max_length=100, unique=True)
slug = models.SlugField(max_length=100, unique=True)
technology = models.ManyToManyField(Technology, blank=True, null=True)
模板:
def portfolio(request, page=1):
sites_list = Site.objects.select_related('technology').only('technology__name', 'name', 'slug',)
return render_to_response('portfolio.html', {'sites':sites_list,}, context_instance=RequestContext(request))
{%用于站点中的站点%}
{{site.name}},
{site.technology.all%中的技术百分比}
{{tech.name}
{%endfor%}
{%endfor%}
但在那个示例中,每个站点都会进行一次额外的查询以获取技术列表。有什么方法可以在1个查询中实现吗?怎么样:
使用Django's;启动时加载列表request.session['lstTechnology']=listOfTechnology
。并在应用程序的其余部分使用会话。如何:
使用Django's;启动时加载列表
request.session['lstTechnology']=listOfTechnology
。并在应用程序的其余部分使用会话。您正在寻找的是一种高效的反向外键查找方法。一般做法是:
{% for site in sites %}
<div>
{{ site.name }},
{% for tech in site.technology.all %}
{{ tech.name }}
{% endfor %}
</div>
{% endfor %}
不久前我写了一篇关于这一点的博客,你可以在这里找到更多信息:你正在寻找的是一种高效的方法来进行反向外键查找。一般做法是:
{% for site in sites %}
<div>
{{ site.name }},
{% for tech in site.technology.all %}
{{ tech.name }}
{% endfor %}
</div>
{% endfor %}
不久前我写了一篇关于这个的博客,你可以在这里找到更多信息:Yhm,所以没有办法减少它?另一种方法是缓存,但我想知道是否有办法做到这一点。嗯,所以没有办法减少它?另一种方法是缓存,但我想知道是否有办法做到这一点。你想在最后生成一个SQL连接吗?Django生成连接的方法有文档记录,但我想你们已经读过了。在主循环的模板中,我想显示分配给每个站点的所有技术。技术由m2m关系分配。所以我运行了子循环,正如您在上面的代码中所看到的。我想减少这些子查询执行的查询数量。我想知道,是否有更好的方法来实现这一点。是否希望最终生成SQL连接?Django生成连接的方法有文档记录,但我想你们已经读过了。在主循环的模板中,我想显示分配给每个站点的所有技术。技术由m2m关系分配。所以我运行了子循环,正如您在上面的代码中所看到的。我想减少这些子查询执行的查询数量。我想知道,是否有更好的方法来做到这一点。如果我有m2m而不是ForeignKey怎么办?对不起,我忽略了您代码中的m2m关系。我还没有对此进行测试,但是关于:1)将中间表加载为qs(我认为只有在指定自定义中间表时才可能),2)使用(myrelatedobj__in=qs)从m2m关系的两侧再加载2个qs,然后手动连接2?不应该超过3个查询。如果我有m2m not ForeignKey怎么办?对不起,我忽略了代码中的m2m关系。我还没有对此进行测试,但是关于:1)将中间表加载为qs(我认为只有在指定自定义中间表时才可能),2)使用(myrelatedobj__in=qs)从m2m关系的两侧再加载2个qs,然后手动连接2?它不应该需要超过3个查询。