我有其中「可變模板」的定義,和連接到每一個位置模型在數據庫中,產生這些變量的實例的2維陣列的模型。的Django - 迭代一個查詢集產生數百查詢
class Location(models.Model):
name = models.CharField(max_length=4, blank=False, unique=True)
class LocationVariableDefinition(models.Model):
name = models.CharField(max_length=32, blank=False, unique=True)
type = models.CharField(max_length=60, default="text")
default_value = models.CharField(max_length=250, blank=True, default="[UNSET]")
class LocationBasedVariable(models.Model):
location = models.ForeignKey(Location)
definition = models.ForeignKey(LocationVariableDefinition, default=None)
value = models.CharField(max_length=250, blank=True)
要編輯這些變量,我有一個單頁有一張桌子,變量名倒邊,並沿頂位置。我添加了一個新的SimpleTag的,讓我從字典中之快譯通訪問值,並認爲產生這個字典:
class VarListView(TemplateView):
template_name = "lbv-list.html"
def locations(self):
return Location.objects.all()
def locvars(self):
dict = {}
for v in LocationBasedVariable.objects.all():
dict.setdefault(v.location.id, {})
dict[v.location.id][v.definition.id] = v.value
return dict
def locvarnames(self):
return LocationVariableDefinition.objects.all()
,然後在模板:
<table class="table table-striped table-condensed striped">
<thead>
<tr>
<th> </th>
{% for loc in view.locations %}
<th>{{ loc.name }}</th>
{% endfor %}
</tr>
</thead>
<tbody>
{% for lv in view.locvarnames %}
<tr>
<th>{{ lv.name }}</th>
{% for loc in view.locations %}
<td>{% get_dictitem2 view.locvars loc.id lv.id%}</td>
{% endfor %}
</tr>
{% endfor %}
</tbody>
</table>
所有作品,除了有3個位置和5個變量,我得到 SQL查詢,需要大約3秒,我的筆記本電腦上運行。
我能做些什麼來改善呢?我一直認爲查詢集會被緩存,但在控制檯中記錄的SQL似乎一遍又一遍地讀取相同的集合。有沒有提示我可以給Django結果不會改變,或者只有一次只做一次查詢的方法?
或者我應該只是傳遞一個排序的查詢集的模板,並在那裏搞清楚的行和列? (我通常會做到這一點的方式將涉及保持狀態在模板的最後位置與當前進行比較,我不認爲我能做到這一點的模板)
您可以通過將'.id'更改爲'_id'來開始減少查詢次數。看到[這個問題](http://stackoverflow.com/q/32869856/1324033)爲例.. – Sayse
我想象下面給出的三個答案應該大大減少您的查詢量和執行時間.. – Sayse
@ Sayse - 同意!我認爲真正的關鍵是我不知何故認爲view.locvars()只會被評估一次。我會回到實際創建一個上下文並添加到它,這是我通常會做的,除了我昨天發現這個整潔的博客文章... – AnotherHowie