当我加载我的菜单选项卡时,我有很多重复的查询(在Django的调试工具栏),我确定我可以优化这个,但没有找到好的方法。需要一些意见重复查询
型号:
class Categorie(models.Model):
name = models.CharField(max_length=30)
visible = models.BooleanField(default = False)
def __str__(self):
return self.nom
def getscateg(self):
return self.souscategorie_set.all().filter(visible = True)
class SousCategorie(models.Model):
name = models.CharField(max_length=30)
visible = models.BooleanField(default = False)
categorie = models.ForeignKey('Categorie')
def __str__(self):
return self.name
def gettheme(self):
return self.theme_set.all().filter(visible = True)
class Theme(models.Model):
name = models.CharField(max_length=100)
visible = models.BooleanField(default = False)
souscategorie = models.ForeignKey('SousCategorie')
def __str__(self):
return self.name
浏览:
def page(request):
categs = Categorie.objects.filter(visible = True)
return render(request, 'page.html', locals())
模板:
{% for categ in categs %}
<li>
{{categ.name}}
<ul>
{% for scateg in categ.getscateg %}
<li>
{{scateg.name}}
<ul>
{% for theme in scateg.gettheme %}
<li>{{ theme.name }}</li>
{% endfor %}
</ul>
</li>
{% endfor %}
</ul>
</li>
{% endfor %}
我看看prefetch_related但只有当我想从SousCategorie和SousCategorie从主题加载Categorie工作,所以如果我明白我需要与此相反......
谢谢您的回答,其实你的主张没有为我工作,我出现此错误:无法将关键字'souscategorie_set'解析为字段。我尝试用这种方法找到一种方法。其实在django调试工具栏我有105重复查询105查询,但他们大多数需要0ms执行,所以没有影响在页面加载,我想我应该发布我的真实模板和查询日志揭露我的问题。 – V1ce
我使用了你在问题中给出的信息,如果你得到这个错误的名称是错误的,请在页面上看看[访问相关对象](https://docs.djangoproject.com/en/1.8/REF /模型/关系/)。 105个查询是非常糟糕的,即使它现在以0ms运行,您应该尝试修复它。另外,我建议阅读[关于优化的文档](https://docs.djangoproject.com/en/1.8/topics/db/optimization/) –