2012-04-21 81 views
2

分貝我有一些model.py像這樣:Django的查詢命中每次迭代

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我想要得到的唯一樣本,發現其中分享所有的標本該生物分類。對於相關標本我需要的只是經/緯信息:

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。我不應該只用一個額外的數據庫查詢就能得到我需要的格式的latitudedecimallongitudedecimal值嗎?我知道我在這裏忽略了一些非常基本的東西,只是不確定完成這件事的最佳方式。

任何幫助將不勝感激。

回答

4

在你的查詢集只需使用select_related

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

將加入您的Muestraonline模型Muestra幕後,由查詢集返回的每個Muestraonline實例也將包含Muestra緩存實例。

+0

完全正確!我完全忘記了'select_related' - 已經有一段時間了,因爲我有打電話來使用它。謝謝。 – 2012-04-21 00:23:17