我有一个这样的model.py:
class Muestraonline(models.Model):
accessionnumber = models.ForeignKey(Muestra, related_name='online_accessionnumber')
muestraid = models.ForeignKey(Muestra)
taxonid = models.ForeignKey(Taxon, null=True, blank=True)
collectedby = models.ForeignKey(Person, null=True, blank=True)
locality = models.ForeignKey(Localitymayor, null=True, blank=True)
在我的views.py中:
def search(request):
...
if genus:
q &= Q(taxonid__genus__icontains = genus)
if species:
q &= (Q(taxonid__specificepithet__icontains = species | Q(taxonid__infraspecificepithet__icontains = species )))
if island_group:
q &= Q(locality__islandgroup__icontains = island_group)
if island_name:
q &= Q(locality__islandname__icontains = island_name)
if collection_acronym:
q &= Q(muestraid__collectionid__collectioncode__icontains = collection_acronym)
if accession_number:
q &= Q(muestraid__accessionnumber = accession_number)
if last_name:
q &= Q(collectedby__verbatimname__icontains = last_name)
if collection_number:
q &= Q(muestraid__collectionnumber = collection_number)
query_set = Muestraonline.objects.filter(q).order_by('taxonid__genus', 'taxonid__specificepithet', 'muestraid')
query_set = list(query_set)
在我的模板中我做了这样的事情:
{% for specimen in items.object_list %}
{{ specimen.taxonid.genus }} -- {{ specimen.taxonid.specificepithet }}
{{ specimen.muestraid_id }}
{{ specimen.accessionnumber_id }}
{{ specimen.muestraid.localitymayorid.islandname }}
{% endfor %}
当我使用 django 调试工具栏查看结果时,我发现初始搜索查询在 db 上非常繁重,但鉴于结构(不会改变),我想这是不可避免的。但是,当我在模板中迭代时,每个对象也会进行查询以获取taxon
和locality
数据。
我认为使用select_related()
可以避免这种情况,但它实际上减慢了请求速度(通过在初始查询中添加一堆连接),并且查询总数保持不变。
我的问题是:我怎样才能最大限度地减少对数据库的命中?例如,我可以让查询集评估一次,然后在模板中的迭代期间从中提取结果吗?如您所见,我已经尝试将其转换query_set
为列表,但这没有区别。
这里的任何指导将不胜感激。