Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 如何减少数据库查询?_Django_Django Queryset - Fatal编程技术网

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个查询。