2009-08-10 41 views
26

Disculpas, soy completamente nuevo en Django y Python.Django - Obteniendo el último objeto creado, filtros simultáneos

Tengo 2 preguntas. Primero, ¿cómo haría para obtener el último objeto creado (o el más alto pk) en una lista de objetos? Por ejemplo, sé que podría utilizar el siguiente para conseguir el primer objeto:

list = List.objects.all()[0] 

¿Hay una manera de conseguir la longitud de List.objects? Probé List.objects.length pero fue en vano.

En segundo lugar, ¿es posible crear filtros simultáneos o combinar listas? He aquí un ejemplo:

def findNumber(request, number) 
    phone_list = Numbers.objects.filter(cell=number) 

Quiero algo como el anterior, pero más como:

def findNumber(request, number) 
    phone_list = Numbers.objects.filter(cell=number or home_phone=number) 

¿Cuál es la sintaxis correcta, si las hay?

Respuesta

42

No he probado esto todavía, pero me gustaría ver el operador latest() en QuerySets:

última (nombre_campo = None)

Devuelve el último objeto en la tabla , por fecha, utilizando field_name provisto como el campo de fecha.

Este ejemplo devuelve la última entrada en la tabla, de acuerdo con el campo pub_date:

Entry.objects.latest ('pub_date')

Si Meta de su modelo especifica get_latest_by, puede deje fuera el argumento field_name para latest(). Django utilizará el campo especificado en get_latest_by de forma predeterminada.

Me gusta get(), latest() plantea DoesNotExist si no existe un objeto con los parámetros especificados.

Nota La última() existe puramente para conveniencia y legibilidad.

Y el model docs on get_latest_by:

get_latest_by

Options.get_latest_by

El nombre de un DateField o DateTimeField en el modelo. Esto especifica el campo predeterminado para usar en el último método de su modelo de administrador.

Ejemplo:

get_latest_by = "order_date"

Consulte la documentación para más reciente() para más.

Editar: Wade tiene una buena respuesta en el operador Q().

+0

¡Gracias, Hugh! Voy a investigar esto también. – zdyn

+0

Awesome answer =) ¡Gracias! –

+0

@hughdbrown ¿Cómo podemos usar lo último en la plantilla de Django? – MegaBytes

12

Para la clave principal más grande, intente esto:

List.objects.order_by('-pk')[0] 

Tenga en cuenta que el uso de pk funciona independientemente del nombre real del campo definido como la clave principal.

20

esto funciona!

Model.objects.latest('field') - el campo puede ser id. que será la última Identificación

+8

Se parece un poco a la respuesta que escribí cuatro meses antes que la tuya, ¿no? – hughdbrown

+4

El tuyo no inspira confianza exactamente con el _No lo he probado todavía_. Esta respuesta si. –

0

alternativa para el último objeto creado:

List.objects.all()[List.objects.count()-1] 

Es necesario añadir un AssertionError para el caso en que no hay elementos de la lista.

except AssertionError: 
    ... 
+2

Esto cargará todos los modelos de la base de datos. – wieczorek1990

9

Desde Django 1.6 - última

last()

Obras como first(), pero devuelve el último objeto de la queryset.

Devuelve el último objeto que coincide con el conjunto de preguntas, o None si no hay ningún objeto coincidente. Si QuerySet no tiene ningún orden definido, entonces el conjunto de consulta se ordena automáticamente por la clave primaria.

list = List.objects.last() le da el último objeto creado

0

estoy trabajando en la versión 1.4.22 Django es, ni tampoco lastlastet está trabajando. Mi manera de resolver con un mínimo de carga db es como:

latest = lambda model_objects, field : model_objects.values_list(field, flat = True).order_by("-" + field)[ 0 ] 
latest_pk = latest(List.objects, "pk") 

Esta función acepta query_set como entrada.

Usted puede unirse a esta función de forma dinámica haciendo:

import types 
List.objects.latest = types.MethodType(latest, List.objects) 

, entonces debería ser capaz de obtener el último objeto por este último pk fácilmente.

Cuestiones relacionadas