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?
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:
Si vous souhaitez obtenir un objet, l'utilisation get()
est plus simple:
obj = Class.objects.get(pk=this_object_id)
id
dans 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 id
fera la bonne chose, par exemple le Class.objects.get(id=this_object_id)
travail. Mais c'est quelque chose à considérer je suppose.
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.py
un mauvais chemin vers mon application qui contient ma Class
dé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.py
avec 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.
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="")
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é.
pk
est le moyen préféré de faire référence à la clé primaire pour n'importe quel modèle. Leid
champ 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 deid
champ.