Necesito verificar si existe un objeto y devolver el objeto, luego, en base a eso, realizar acciones. ¿Cuál es la forma correcta de hacerlo sin devolver un 404?
try:
listing = RealEstateListing.objects.get(slug_url = slug)
except:
listing = None
if listing:
django
django-views
Rasiel
fuente
fuente
if listing:
debería haber unaelse:
.Respuestas:
No usaría el contenedor 404 si no le dan un 404. Eso es un mal uso de la intención. En su lugar, solo captura el DoesNotExist.
fuente
exists()
si necesita hacer algo con el objeto.values_list('id', flat=True)
. si solo necesito ver si existelisting = RealEstateListing.objects.values_list('id', flat=True).get(slug_url=slug)
RealEstateListing.DoesNotExist
se refiere al modelo y no al objeto en sí. ¿Por qué no es asíRealEstateListing.objects.get(slug_url=slug).DoesNotExist
?También puedes hacer:
A veces es más claro usar
try: except:
bloque y otras veces una sola líneaexists()
hace que el código se vea más claro ... todo depende de la lógica de su aplicación.fuente
exists()
no funcionaget()
, ¿verdad?get()
más tarde, enviará una segunda consulta a la base de datos.try-except
másexists()
.fuente
if listing:
.exists()
. Creo que es una buena idea en SO tener múltiples respuestas diferentes sobre cómo hacer las cosas. Quizás esto sea mejor para aquellos que también quieran usar el objeto si existe. No haría ninguna regla si se debe evitar try / except o no. A veces es bueno y otras es malo, por ejemplo, si solo desea hacer un código muy compacto.Lo haría tan simple como sigue:
No veo la necesidad de probar / atrapar. Si hay potencialmente varios objetos en el resultado, utilice primero () como lo muestra el usuario Henrik Heino
fuente