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?

Réponses:


180

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

obj = Class.objects.get(pk=this_object_id)

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.


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.


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="")

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.