Consulta de base de datos de Django: ¿Cómo obtener un objeto por id?

105

Django crea automáticamente un campo de identificación como clave principal.

Ahora necesito obtener el objeto por esta identificación.

object = Class.objects.filter() 

¿Cómo escribir este filtro?

usuario469652
fuente

Respuestas:

179

Si desea obtener un objeto, usarlo get()es más sencillo:

obj = Class.objects.get(pk=this_object_id)
iridiscente
fuente
18
FYI, pkes la forma preferida de referirse a la clave principal para cualquier modelo. El idcampo solo se genera si el autor del modelo no designa específicamente una clave principal. Si el autor hizo especificar un campo de clave principal que no se nombra id, entonces no habrá un idcampo.
Craig Trader
También para su información, iden una función incorporada que devuelve la identidad de un objeto. En la mayoría de los casos, hacer referencia a cosas con idhará lo correcto, por ejemplo, Class.objects.get(id=this_object_id)funcionará. Pero eso es algo a considerar, supongo.
Tom
15

Llegué aquí por el mismo problema, pero por una razón diferente:

Class.objects.get(id=1)

Este código estaba generando una excepción ImportError. Lo que me confundió fue que el código a continuación se ejecutó bien y devolvió un conjunto de resultados como se esperaba:

Class.objects.all()

Cola del rastreo del get()método:

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

Al leer el código dentro de Django loading.py, llegué a la conclusión de que settings.pytenía una ruta incorrecta a mi aplicación que contiene la Classdefinición de mi modelo. Todo lo que tuve que hacer fue corregir la ruta a la aplicación y el get()método se ejecutó bien.

Aquí está mi settings.pycon la ruta corregida:

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

)

Toda la confusión se debió a que estoy usando el ORM de Django como independiente, por lo que el espacio de nombres tenía que reflejar eso.

Lucio Paiva
fuente
2

También puedes hacer:

obj = ClassModel.get_by_id(object_id)

Esto funciona, pero es posible que no esté seguro de si es compatible con Django 2.

Antonio
fuente
2

Puedes usar:

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

Esto devolverá un conjunto de consultas incluso si obtiene un objeto. Si necesita exactamente un objeto, utilice:

obj=Class.objects.get(conditon="")
Pratik Randad
fuente