2009-08-10 6 views
26

Mi scuso, sono completamente nuovo per Django e Python.Django - Ottenere l'ultimo oggetto creato, filtri simultanei

Ho 2 domande. Innanzitutto, come farei per ottenere l'ultimo oggetto creato (o il più alto pk) in una lista di oggetti? Per esempio, io so che avrei potuto utilizzare la seguente per ottenere il primo oggetto:

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

C'è un modo per ottenere la lunghezza del List.objects? Ho provato List.objects.length ma inutilmente.

In secondo luogo, è possibile creare filtri simultanei o combinare elenchi? Ecco un esempio:

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

voglio qualcosa di simile a quanto sopra, ma più come:

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

Qual è la sintassi corretta, se del caso?

risposta

42

non ho ancora provato questo, ma mi piacerebbe vedere l'operatore latest() su QuerySets:

ultima (nome_campo = None)

Restituisce l'ultimo oggetto nella tabella , per data, utilizzando il campo nome fornito come campo della data.

Questo esempio restituisce l'ultima entrata nella tabella, in base al campo pub_date:

Entry.objects.latest ('pub_date')

Se Meta del modello indica get_latest_by, è possibile lasciare fuori l'argomento field_name to latest(). Django utilizzerà il campo specificato in get_latest_by per impostazione predefinita.

Come get(), latest() solleva DoesNotExist se un oggetto non esiste con i parametri specificati.

Nota ultima() esiste puramente per convenienza e leggibilità.

E il model docs on get_latest_by:

get_latest_by

Options.get_latest_by

Il nome di un DateField o DateTimeField nel modello. Specifica il campo predefinito da utilizzare nell'ultimo metodo del modello Manager.

Esempio:

get_latest_by = "order_date"

Vedi la documentazione per ultima() per più.

Modifica: Wade ha una buona risposta sull'operatore Q().

+0

Grazie, Hugh! Approfondirò anche questo. – zdyn

+0

Risposta stupenda =) Grazie! –

+0

@hughdbrown Come possiamo usare l'ultimo modello di Django ?? – MegaBytes

12

Per la più grande chiave primaria, provate questo:

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

noti che usare pk funziona indipendentemente dal nome effettivo del campo definito come chiave primaria.

20

questo funziona!

Model.objects.latest('field') - campo può essere id. che sarà l'ultima id

+8

Sembra un po 'come la risposta che ho scritto quattro mesi prima della tua, no? – hughdbrown

+4

Il tuo non ispira esattamente la fiducia con il _Io non l'ho ancora provato_. Questa risposta fa. –

0

alternativa per l'ultimo oggetto creato:

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

E 'necessario aggiungere un AssertionError per il caso in cui non vi sono elementi nella lista.

except AssertionError: 
    ... 
+2

Questo caricherà tutti i modelli dal database. – wieczorek1990

9

Dal Django 1.6 - ultimo

last()

Opere come first(), ma restituisce l'ultimo oggetto nel set di query.

Restituisce l'ultimo oggetto corrispondente al queryset o None se non è presente alcun oggetto corrispondente. Se il QuerySet non ha alcun ordine definito, il queryset viene automaticamente ordinato dalla chiave primaria.

list = List.objects.last() ti dà l'ultimo oggetto creato

0

sto lavorando versione Django è 1.4.22, né lastlastet sta lavorando. mio modo per risolvere con db carico minimo è simile:

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

Questa funzione accetta query_set come input.

Si possono vincolare questa funzione in modo dinamico facendo:

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

allora si dovrebbe essere in grado di ottenere l'ultimo oggetto da questo ultimo pk facilmente.