2011-01-11 11 views
16

Ich habe ein Basismodell „Orte“ genannt, die diese Ansicht hat:Erhalten Objekt-ID basiert auf dem Typ django Attribut

def view_index(request, place_name): 

Der Benutzer diese Ansicht mit einer URL wie diesem werden zugreifen:

http://server.com/kansas 

"Kansas" ist ein Wert, der in einem Feld namens "name" im Modell "Places" gespeichert ist.

Das Problem ist, dass ich nicht herausfinden kann, wie die Objekt-ID nur anhand des Objektnamens erhalten. Gibt es eine Möglichkeit, dies zu tun?

Antwort

34

So:

place = Places.objects.get(name='kansas') 
print place.id 
+1

Oh my ... Ich bin dumm, wie ich kann es nicht herausgefunden? Danke :-) –

3

Was ist Ihr URL-Mapping für diese Ansicht aussehen? Angenommen, Sie erfassen den Teil Ihrer URL mit "kansas" darin und das wird auf das place_name Argument gesetzt, müssen Sie eine einfache filter auf Ihrem Modell-Manager auf jedem Modellfeld, das Sie suchen nach "kansas" in.

Wenn Ihre URL-Zuordnung wie folgt aussieht:

('(?P<place_name>\w+)$', 'myapp.view.view_index') 

Dann sollten Sie in der Lage sein, nur

object_list = Model.objects.filter(place_name = place_name) 

zu tun, um eine Liste von Objekten zu erhalten, die ein place_name hat, die übereinstimmt in der URL. Von dort aus sollte jedes der Objekte in dieser Liste eine id haben (es sei denn, Sie haben das ID-Feld umbenannt), die Sie wie jedes andere Python-Objektattribut erhalten können.

3

Da Sie nur id möchten, sollten Sie nur id abfragen. Ein naives get ruft alle Felder in der Datenbankzeile ab. Eine dieser Methoden ruft nur die gewünschten Daten ab.

id = Place.objects.filter(name='kansas').values('id')[0]['id'] 

Ein anderes Verfahren verwendet only:

id = Place.objects.only('id').get(name='kansas').id 
+0

Wird dies effizienter als die angenommene Antwort? –