Django查询每次迭代都会命中数据库

时间:2012-04-21 00:07:28

标签: django django-queryset

我有一些 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)
    ...

class Muestra(models.Model):
    muestraid = models.IntegerField(primary_key=True, db_column='MuestraID') # Field name made lowercase.
    latitudedecimal = models.DecimalField(decimal_places=6, null=True, max_digits=20, db_column='LatitudeDecimal', blank=True) # Field name made lowercase.
    longitudedecimal = models.DecimalField(decimal_places=6, null=True, max_digits=20, db_column='LongitudeDecimal', blank=True) # Field name made lowercase.
    ...

我的 view.py 我想获得独特的标本并找到所有与该分类标准相同的标本。对于相关样本,我只需要lat / long信息:

def specimen_detail(request, accession_number=None, specimen_id=None):
    specimen = Muestraonline.objects.get(accessionnumber=accession_number, muestraid=specimen_id)
    related_specimens = Muestraonline.objects.filter(taxonid=specimen.taxonid).exclude(id=specimen.id)

    # create array for the related specimen points 
    related_coords = []
    # loop through results and populate array
    for relative in related_specimens:
        latlon = (format(relative.muestraid.latitudedecimal), format(relative.muestraid.longitudedecimal))
        related_coords.append(latlon) 
    related_coords = simplejson.dumps(related_coords)

但是当我遍历related_specimens时,它最终会为每个relative命中一次db。我不应该只使用一个额外的数据库查询以我需要的格式获取latitudedecimallongitudedecimal值吗?我知道我在这里的方法中遗漏了一些非常基本的东西,只是不确定完成这项工作的最佳方法。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:4)

只需在QuerySet中使用select_related

related_specimens = Muestraonline.objects.filter(taxonid=specimen.taxonid).exclude(id=specimen.id).select_related('muestraid')

这将在幕后将Muestraonline模型加入Muestra,QuerySet返回的每个Muestraonline实例也将包含Muestra的缓存实例。