Django Obtener la última entrada de la base de datos

Tengo 2 preguntas, pero están relacionadas con el mismo tema.

Sé cómo recuperar datos de un for loop utilizando tags de plantilla

 {% for status in status %}  {{ status.status}}  {% endfor %} 

Sin embargo, cuando quiero recuperar un solo objeto, obtengo un error incluso cuando uso:

 po = Status.objects.latest('id') 

y quitar el bucle for.

Yo obtengo:

 'Status' object is not iterable 

Mis preguntas son:

  1. ¿Cómo puedo obtener la última entrada de la base de datos para un modelo determinado?
  2. ¿Cómo puedo configurar mis tags de plantillas para permitir un solo registro?

Tienes dos preguntas diferentes aquí:

  1. ¿Cómo recupero el último objeto de la base de datos?

Puede hacer esto utilizando el operador de conjunto de consultas latest() . Al leer los documentos, notará que este operador trabaja en campos de fecha, no en enteros.

 Status.objects.latest('date_added') # or date_updated 

Si desea hacer esto fuera del ID, deberá ordenar por ID y seleccionar el primer resultado. (Esto solo funcionará si está utilizando claves primarias incrementales, no funcionará con UUID o hashes generados aleatoriamente).

 Status.objects.order_by('id')[0] 

Nota al date_added / date_updated : Personalmente utilizaría la forma date_added / date_updated para hacer esto.

  1. Iterando sobre un solo objeto

Un solo objeto no puede ser iterado. Para esto necesitarás usar una plantilla diferente. O bien, deberá agregar el único objeto a una lista.

 # note the [] around the query result = [Status.object.latest('date_added')] 

Personalmente tengo una vista diferente para listar resultados únicos / múltiples. Tengo un ListView para muchos objetos de resultados y un DetailView para objetos individuales.

Esto se debe a que la latest versión devuelve una sola instancia en lugar de un queryset (que es iterable). Asi que:

1) Lo último no funciona porque funciona con los campos de fecha. Lea más en: https://docs.djangoproject.com/en/1.8/ref/models/querysets/#latest . ‘id’ no es un campo válido para usar con el latest filtro.

2) No se puede usar for la etiqueta de plantilla con una sola instancia porque no es iterable.

Para resolver su situación, especificaría el campo para ordering = ('id',) en la clase Meta del modelo y luego hacer un po = Status.objects.all()[:1] para que obtenga un queryset (que es iterable) con un solo objeto en ella. Luego podrás usar la etiqueta for plantilla con tu variable po .

Espero eso ayude.