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?
fuente
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?
Si desea obtener un objeto, usarlo get()
es más sencillo:
obj = Class.objects.get(pk=this_object_id)
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.py
tenía una ruta incorrecta a mi aplicación que contiene la Class
definició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.py
con 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.
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.
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="")
También puede usar el acceso directo get_object_or_404 de django. Genera un error 404 si no se encuentra el objeto.
pk
es la forma preferida de referirse a la clave principal para cualquier modelo. Elid
campo 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 nombraid
, entonces no habrá unid
campo.id
en una función incorporada que devuelve la identidad de un objeto. En la mayoría de los casos, hacer referencia a cosas conid
hará lo correcto, por ejemplo,Class.objects.get(id=this_object_id)
funcionará. Pero eso es algo a considerar, supongo.