2009-03-12 7 views
63

básicamente solo verifica si un objeto existe y devuelve el objeto. entonces basado en eso realiza acciones. Me pregunto cuál es la forma correcta de hacerlo sin devolver un 404?¿Cuál es la forma correcta de validar si un objeto existe en una vista django sin devolver 404?

try: 
    listing = RealEstateListing.objects.get(slug_url = slug) 
except: 
    listing = None 

if listing: 
+0

Rasiel, ¿puedo sugerir que acepte la otra respuesta? Parece ser la forma correcta de hacer esto, y ha sido votado un poco más que la respuesta aceptada. – Azendale

+0

Lo puedo considerar, sin embargo, existió en Django 1.2, que se publicó el 17 de mayo de 2010, si nota que mi pregunta fue enviada en 09 ... esta fue la respuesta correcta en ese momento. Si Exists() ahora se considera la mejor manera de hacerlo, creo que sería semánticamente correcto elegir la segunda respuesta, ¿no? – Rasiel

+0

Rasiel, tiene sentido que esa fuera la respuesta correcta en ese momento. Pero los sitios de stackoverflow parecen centrarse tanto en construir un conjunto de preguntas buenas/oficiales con las mejores respuestas, ya que los sitios están encontrando soluciones a los problemas de las personas. De ahí mi sugerencia de seleccionar lo que ahora es la respuesta "oficialmente correcta". – Azendale

Respuesta

86

No utilizaría el envoltorio 404 si no se le proporciona un 404. Ese es un uso indebido de la intención. Simplemente atrapa el DoesNotExist, en su lugar.

try: 
    listing = RealEstateListing.objects.get(slug_url=slug) 
except RealEstateListing.DoesNotExist: 
    listing = None 
+0

+1: Yo usaría esto en lugar de la envoltura 404 también. – Tiago

+0

+1: Sí, esta es una solución mejor que la aceptada, si no quiere el 404. –

+0

yap, esta parece ser la mejor solución – Rasiel

141

También se puede hacer

if not RealEstateListing.objects.filter(slug_url=slug).exists(): 
    do stuff... 

A veces es más claro para usar intento: excepto: bloque y otras veces existe una sola línea() hace que el código más claro mirando ... todo depende de su lógica de aplicación.

+6

.exists() es más rápido: https: //docs.djangoproject .com/es/dev/ref/models/querysets/# existe – fjsj

+5

esta es la mejor manera y debería tener la respuesta – Jharwood

+0

Me gusta más que la forma try/except too – robbyt

2
listing = RealEstateListing.objects.filter(slug_url=slug).first() 
+0

Esta es la mejor solución si necesita usar el objeto potencial más adelante, ya que solo requiere una asignación y evita tener que usar un bloque try/except. Tenga en cuenta que puede probar la existencia más adelante simplemente con 'if listing:' –

Cuestiones relacionadas