web-dev-qa-db-fra.com

Obtenir Django id d'objet basé sur l'attribut de modèle

J'ai un modèle de base nommé "Places" qui a cette vue:

def view_index(request, place_name):

L'utilisateur accédera à cette vue avec une URL comme celle-ci:

http://server.com/kansas

"kansas" est une valeur stockée dans un champ nommé "nom" à l'intérieur du modèle "Places".

Le problème est que je ne peux pas comprendre comment obtenir l'ID d'objet en se basant uniquement sur le nom de l'objet. Y a-t-il un moyen de faire cela?

25
Oscar Carballal

Comme ça:

place = Places.objects.get(name='kansas')
print place.id
57
gruszczy

Comme vous ne voulez que id, vous ne devez rechercher que id. Un get naïf récupérera tous les champs de la ligne de la base de données. L'une ou l'autre de ces méthodes ne récupérera que les données souhaitées.

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

Ou avec values_list:

id = Place.objects.filter(name='kansas').values_list('id', flat=True).first()

Une autre méthode utilise only:

id = Place.objects.only('id').get(name='kansas').id
10
Scott Stafford

À quoi ressemble le mappage d'URL pour cette vue? En supposant que vous capturez la partie de votre URL avec "kansas" dedans et qui est réglé sur place_name argument, vous devrez faire un simple filter sur le gestionnaire de votre modèle sur le champ de modèle que vous recherchez "kansas" dans.

Si votre mappage d'URL ressemble à:

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

Alors vous devriez pouvoir faire juste

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

pour obtenir une liste des objets qui ont un place_name qui correspond à celui de l'URL. À partir de là, chacun des objets de cette liste doit avoir un id (sauf si vous avez renommé le champ ID) que vous pouvez utiliser comme n'importe quel autre attribut d'objet python.

4
Daniel DiPaolo