2

私はそのようないくつかの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は、ユニークな標本を取得し、その分類群を共有するすべての標本を見つけたいと思っています。関連する標本については、緯度/経度の情報が必要です。

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と、データベースに1回ずつヒットすることになりますrelative。追加のdbクエリを1つだけ使用して、必要な形式で値latitudedecimalと値を取得できるようにすべきではありませんか?longitudedecimal私はここでの私のアプローチで非常に基本的な何かが欠けていることを知っていますが、これを行うための最良の方法がわかりません。

どんな助けでも大歓迎です。

4

1 に答える 1

4

QuerySetで select_related を使用するだけです。

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

Muestraonlineこれにより、モデルがバックグラウンドで結合され、QuerySet によって返されるMuestraMuestraonlineインスタンスにも のキャッシュされたインスタンスが含まれますMuestra

于 2012-04-21T00:17:11.797 に答える