Requête de base de données Django: Comment obtenir un objet par identifiant?

105

Django crée automatiquement un champ id comme clé primaire.

Maintenant, j'ai besoin d'obtenir l'objet par cet identifiant.

object = Class.objects.filter() 

Comment écrire ce filtre?

user469652
la source

Réponses:

180

Si vous souhaitez obtenir un objet, l'utilisation get()est plus simple:

obj = Class.objects.get(pk=this_object_id)
iridescent
la source
18
FYI, pkest le moyen préféré de faire référence à la clé primaire pour n'importe quel modèle. Le idchamp n'est généré que si l'auteur du modèle ne désigne pas spécifiquement une clé primaire. Si l'auteur a spécifié un champ de clé primaire qui n'est pas nommé id, il n'y aura pas de idchamp.
Craig Trader
Aussi FYI, iddans une fonction intégrée qui renvoie l'identité d'un objet. Dans la majorité des cas, le fait de référencer les choses par idfera la bonne chose, par exemple le Class.objects.get(id=this_object_id)travail. Mais c'est quelque chose à considérer je suppose.
Tom
15

Je suis arrivé ici pour le même problème, mais pour une raison différente:

Class.objects.get(id=1)

Ce code soulevait une exception ImportError. Ce qui me déroutait, c'est que le code ci-dessous s'exécutait correctement et renvoyait un jeu de résultats comme prévu:

Class.objects.all()

Queue de la trace de la get()méthode:

File "django/db/models/loading.py", line 197, in get_models
    self._populate()
File "django/db/models/loading.py", line 72, in _populate
    self.load_app(app_name, True)
File "django/db/models/loading.py", line 94, in load_app
    app_module = import_module(app_name)
File "django/utils/importlib.py", line 35, in import_module
    __import__(name)
ImportError: No module named myapp

En lisant le code à l'intérieur de Django loading.py, je suis arrivé à la conclusion que j'avais settings.pyun mauvais chemin vers mon application qui contient ma Classdéfinition de modèle. Tout ce que j'avais à faire était de corriger le chemin d'accès à l'application et la get()méthode s'exécutait correctement .

Voici mon settings.pyavec le chemin corrigé:

INSTALLED_APPS = (
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    # ...
    'mywebproject.myapp',

)

Toute la confusion a été causée parce que j'utilise l'ORM de Django de manière autonome, donc l'espace de noms devait refléter cela.

Lucio Paiva
la source
2

Vous pouvez également faire:

obj = ClassModel.get_by_id(object_id)

Cela fonctionne, mais il se peut que je ne sois pas sûr qu'il soit pris en charge dans Django 2.

Anthony
la source
2

Vous pouvez utiliser:

objects_all=Class.objects.filter(filter_condition="")

Cela renverra un ensemble de requêtes même s'il obtient un objet. Si vous avez besoin d'un seul objet, utilisez:

obj=Class.objects.get(conditon="")
Pratik Randad
la source
1

Vous pouvez également utiliser le raccourci get_object_or_404 django. Il génère une erreur 404 si l'objet n'est pas trouvé.

Loaderon
la source