Cuando le pido al administrador de modelos que obtenga un objeto, surge DoesNotExist
cuando no hay ningún objeto coincidente.
go = Content.objects.get(name="baby")
En lugar de DoesNotExist
, ¿cómo puedo haber go
sido None
en su lugar?
python
django
django-queryset
TIMEX
fuente
fuente
SomeModel.objects.filter(foo='bar').first()
esto devuelve la primera coincidencia, o Ninguno. No falla si hay varias instancias comoqueryset.get()
filter().first()
, creo que la excepción es el camino a seguir.Desde django 1.6 puede usar el método first () de esta manera:
fuente
De django docs
Puede atrapar la excepción y asignar
None
para ir.fuente
Puede crear una función genérica para esto.
Use esto como a continuación:
go será None si ninguna entrada coincide con otra, devolverá la entrada de Contenido.
Nota: Se generará una excepción MultipleObjectsReturned si se devuelve más de una entrada para name = "baby"
fuente
Puedes hacerlo de esta manera:
Ahora ir variable podría ser el objeto que desea o Ninguno
Ref: https://docs.djangoproject.com/en/1.8/ref/models/querysets/#django.db.models.query.QuerySet.first
fuente
Para facilitar las cosas, aquí hay un fragmento del código que escribí, basado en las entradas de las maravillosas respuestas aquí:
Y luego en tu modelo:
Eso es. Ahora tiene MyModel.objects.get () así como MyModel.objetcs.get_or_none ()
fuente
podrías usar
exists
con un filtro:solo una alternativa para si solo quieres saber si existe
fuente
Note: If you only want to determine if at least one result exists (and don’t need the actual objects), it’s more efficient to use exists().
exists()
lo tanto , se usará con unaif
cláusula antes de recuperar el objeto, por lo tanto, causará un doble golpe a la base de datos. Todavía mantendré el comentario en caso de que ayude a alguien más.Manejar excepciones en diferentes puntos de sus vistas podría ser realmente engorroso ... ¿Qué pasa con la definición de un Model Manager personalizado, en el archivo models.py, como
y luego incluirlo en la clase de modelo de contenido
De esta manera se puede tratar fácilmente en las vistas, es decir
fuente
return self.get(**kwargs)
que funcione para mí. Por no decir que hay algo mal con la respuesta, solo un consejo para cualquiera que intente usarlo con versiones posteriores (o con cualquier otra cosa que no funcionó para mí).Es una de esas molestas funciones que quizás no quieras volver a implementar:
fuente
get_object_or_None
pero encontré que aún se elevaMultipleObjectsReturned
si hay más de un objeto. Por lo tanto, el usuario podría considerar rodearse con untry-except
(que la función en sítry-except
ya tiene).Si desea una solución simple de una línea que no implique el manejo de excepciones, declaraciones condicionales o un requisito de Django 1.6+, haga esto en su lugar:
fuente
Creo que no es mala idea usar
get_object_or_404()
Este ejemplo es equivalente a:
Puede leer más sobre get_object_or_404 () en la documentación en línea de django.
fuente
Desde django 1.7 en adelante, puede hacer como:
La ventaja de "MyQuerySet.as_manager ()" es que funcionará lo siguiente:
fuente
Aquí hay una variación en la función auxiliar que le permite pasar opcionalmente una
QuerySet
instancia, en caso de que desee obtener el objeto único (si está presente) de un conjunto de consultas que no sea el conjunto de consultas deall
objetos del modelo (por ejemplo, de un subconjunto de elementos secundarios que pertenecen a un instancia principal):Esto se puede usar de dos maneras, por ejemplo:
obj = get_unique_or_none(Model, **kwargs)
como se discutió anteriormenteobj = get_unique_or_none(Model, parent.children, **kwargs)
fuente
Sin excepción:
Usando una excepción:
Hay una pequeña discusión sobre cuándo se debe usar una excepción en python. Por un lado, "es más fácil pedir perdón que permiso". Si bien estoy de acuerdo con esto, creo que una excepción debería permanecer, bueno, la excepción, y el "caso ideal" debería ejecutarse sin golpear a uno.
fuente
Podemos usar la excepción incorporada de Django que se adjunta a los modelos nombrados como
.DoesNotExist
. Por lo tanto, no tenemos que importarObjectDoesNotExist
excepciones.En cambio haciendo:
Podemos hacer esto:
fuente
Este es un imitador de get_object_or_404 de Django, excepto que el método devuelve Ninguno. Esto es extremadamente útil cuando tenemos que usar la
only()
consulta para recuperar ciertos campos solamente. Este método puede aceptar un modelo o un conjunto de consultas.fuente
Quizás sea mejor que uses:
fuente