Django - Come ultimo oggetto creato, filtri simultanei
-
12-09-2019 - |
Domanda
Ci scusiamo, sono completamente nuovo a Django e Python.
Ho 2 domande. In primo luogo, come potrei fare per ottenere l'ultimo oggetto creato (o più alto pk) in un elenco 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 di List.objects? Ho provato List.objects.length ma senza alcun risultato.
In secondo luogo, è possibile creare filtri simultanei o combinare gli elenchi? Ecco un esempio:
def findNumber(request, number)
phone_list = Numbers.objects.filter(cell=number)
Voglio qualcosa di simile a quanto sopra, ma più simile a:
def findNumber(request, number)
phone_list = Numbers.objects.filter(cell=number or home_phone=number)
Qual è la sintassi corretta, se del caso?
Soluzione
Non ho ancora provato questo, ma mi piacerebbe guardare il ultima () operatore set di query :
ultima (nome_campo = None)
Restituisce l'ultimo oggetto nella tavolo, per data, utilizzando il field_name fornito come il campo data.
Questo esempio restituisce la voce più recente nella tabella, secondo la campo pub_date:
Entry.objects.latest ( 'pub_date')
Se specifica Meta del modello get_latest_by, è possibile lasciare fuori argomento field_name alla più recente (). Django utilizzerà il campo specificato in get_latest_by per impostazione predefinita.
Come get (), ultima () solleva DoesNotExist se un oggetto non lo fa esistere con i parametri indicati.
Nota ultima () esiste esclusivamente per convenienza e la leggibilità.
E le su get_latest_by :
get_latest_by
Options.get_latest_by
Il nome di un DateField o DateTimeField nel modello. Questa specifica il campo predefinito da utilizzare in ultimo metodo vostro modello di Manager.
Esempio:
get_latest_by = "order_date"
Si veda la documentazione per l'ultimo () per ulteriori informazioni.
Modifica:. Wade ha una buona risposta su Q () Operatore
Altri suggerimenti
questo funziona!
Model.objects.latest('field')
- campo può essere id. che sarà l'ultima id
Per la più grande chiave primaria, provate questo:
List.objects.order_by('-pk')[0]
Si noti che usando pk
funziona indipendentemente dal nome effettivo del campo definito come la chiave primaria.
Dal Django 1.6 - ultimo
last()
funziona come first()
, ma restituisce l'ultimo oggetto nel set di query.
Restituisce l'ultimo oggetto di pari passo con il set di query, o None
se non v'è oggetto corrispondente. Se il QuerySet ha definito nessun ordinamento, quindi il set di query è ordinato automaticamente la chiave primaria.
list = List.objects.last()
ti dà l'ultimo oggetto creato
È possibile utilizzare il metodo count () su una query impostare il ottenere il numero di oggetti.
list = List.objects.all()
list.count()
Gli argomenti a filtro sono "E" ed insieme. Se avete bisogno di fare o filtri guardare gli oggetti Q. http: //docs.djangoproject .com / it / dev / argomenti / db / query / # complesse-ricerche-con-Q-oggetti
alternativa per l'ultimo oggetto creato:
List.objects.all()[List.objects.count()-1]
E 'necessario aggiungere un AssertionError per il caso in cui non ci sono voci nell'elenco.
except AssertionError:
...
Sto lavorando su versione Django è 1.4.22, né last
nè lastet
sta lavorando.
Il mio modo di risolvere con un minimo di db di carico è come:
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.
È possibile associare questa funzione in modo dinamico facendo:
import types
List.objects.latest = types.MethodType( latest, List.objects )
Poi si dovrebbe essere in grado di ottenere l'ultimo oggetto da questo ultimo pk facilmente.