Django - Primeros último objeto creado, filtros simultáneos
-
12-09-2019 - |
Pregunta
Las disculpas, soy completamente nuevo en Django y Python.
Tengo 2 preguntas. En primer lugar, ¿cómo iba a ir sobre cómo obtener el último objeto creado (o 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? He intentado List.objects.length pero fue en vano.
En segundo lugar, ¿es posible crear filtros simultáneos o combinar las 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?
Solución
No he probado esto todavía, pero me gustaría ver el última () operador en QuerySets :
última (nombre_campo = None)
Devuelve el último objeto en el mesa, por fecha, mediante el nombre_campo siempre que el campo de fecha.
Este ejemplo devuelve la última entrada en la tabla, de acuerdo con la campo pub_date:
Entry.objects.latest ( 'pub_date')
Si especifica Meta de su modelo get_latest_by, puede dejar fuera de la argumento nombre_campo a la última (). Django usará el campo especificado en get_latest_by por defecto.
Al igual que get (), el último () lanza DoesNotExist si un objeto no lo hace existir con los parámetros dados.
Nota última () existe únicamente para conveniencia y facilidad de lectura.
get_latest_by
Options.get_latest_by
El nombre de un DateField o DateTimeField en el modelo. Esto especifica el campo por defecto a utilizar en el último método de su modelo de Manager.
Ejemplo:
get_latest_by = "order_date"
Consulte la documentación para el último () para más.
Editar:. Wade tiene una buena respuesta en Q () operador
Otros consejos
esto funciona!
Model.objects.latest('field')
- Identificación del campo puede ser. que será la última id
Para obtener la clave principal más grande, intente lo siguiente:
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.
Desde Django 1.6 - la última
last()
funciona como first()
, pero devuelve el último objeto de la queryset.
Devuelve el último objeto igualados por el conjunto de consultas, o None
si no hay ningún objeto coincidente. Si el QuerySet ha definido ningún orden, entonces el conjunto de consultas se ordena automáticamente por la clave principal.
list = List.objects.last()
le da el último objeto creado
Puede utilizar el método de conteo () en una consulta de establecer el obtener el número de elementos.
list = List.objects.all()
list.count()
Argumentos para filtrar son "Y" ed juntos. Si necesita hacer o filtros mira objetos Q. http: //docs.djangoproject .com / es / dev / temas / db / consultas / # complejas operaciones de búsqueda-con-objetos-Q-
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:
...
Estoy trabajando en la versión 1.4.22 de Django es, ni tampoco last
lastet
está trabajando.
Mi manera de resolver con la carga mínima 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.
Es posible que esta función se unen dinámicamente haciendo:
import types
List.objects.latest = types.MethodType( latest, List.objects )
A continuación, usted debe ser capaz de obtener el último objeto por este último pk fácilmente.