2009-08-10 3 views
26

Entschuldigung, ich bin komplett neu in Django und Python.Django - Immer das letzte Objekt erstellt, simultane Filter

Ich habe 2 Fragen. Erstens, wie würde ich gehen, um das letzte Objekt (oder höchste pk) in einer Liste von Objekten zu bekommen? Zum Beispiel weiß ich, dass ich folgendes bekommt das erste Objekt verwenden:

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

Gibt es eine Möglichkeit, die Länge von List.objects zu bekommen? Ich habe List.objects.length versucht, aber ohne Erfolg.

Zweitens, ist es möglich, simultane Filter zu erstellen oder Listen zu kombinieren? Hier ein Beispiel:

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

ich so etwas wie die oben will, sondern eher wie:

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

Was ist die korrekte Syntax, wenn überhaupt?

Antwort

42

Ich habe dies noch nicht ausprobiert, aber ich würde auf QuerySets am latest() Betreiber aussehen:

neuesten (field_name = None)

Gibt das letzte Objekt in der Tabelle , nach Datum, mit dem Feldfeldname , das als Datumsfeld angegeben wurde.

In diesem Beispiel werden die neuesten Eintrag in der Tabelle nach dem pub_date Feld:

Entry.objects.latest ('pub_date')

Wenn Meta Ihres Modells get_latest_by gibt, können Sie Lassen Sie das Argument field_name auf next(). Django verwendet standardmäßig das in angegebene Feld get_latest_by.

Wie get(), neustes() löst aus DoesNotExist, wenn ein Objekt mit den angegebenen Parametern nicht existiert.

Hinweis letzte() existiert rein für Bequemlichkeit und Lesbarkeit.

Und die model docs on get_latest_by:

get_latest_by

Options.get_latest_by

Der Name eines Datefield oder Datetimefield im Modell. Dies gibt das Standardfeld an, das in der neuesten Methode des Modellmanagers verwendet werden soll.

Beispiel:

get_latest_by = "order_date"

die Dokumentation finden Sie die neuesten() für mehr.

Bearbeiten: Wade hat eine gute Antwort auf Q() -Operator.

+0

Danke, Hugh! Ich werde das auch untersuchen. – zdyn

+0

Super Antwort =) Danke! –

+0

@hughdbrown Wie können wir neueste Django-Vorlage verwenden? – MegaBytes

12

Für den größten Primärschlüssel, versuchen Sie dies:

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

Beachten Sie, dass pk mit arbeitet unabhängig von den tatsächlichen Namen des Feldes als Primärschlüssel definiert.

20

das funktioniert!

Model.objects.latest('field') - Feld kann id sein. dass die neueste id

+8

Sieht ein bisschen wie die Antwort aus, die ich vier Monate vor deiner geschrieben habe, nein? – hughdbrown

+4

Ihr Vertrauen ist nicht gerade inspirierend. Ich habe das noch nicht probiert. Diese Antwort tut es. –

0

Alternative für das neueste Objekt erstellt werden:

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

Es ist notwendig, eine AssertionError für den Fall hinzufügen, wenn es keine Einträge in der Liste sind.

except AssertionError: 
    ... 
+2

Dies lädt alle Modelle aus der Datenbank. – wieczorek1990

9

Da Django 1.6 - letzte

last()

Arbeiten wie first(), sondern gibt das letzte Objekt in der queryset.

Gibt das letzte Objekt zurück, das dem Abfrage-Set entspricht, oder None, wenn kein übereinstimmendes Objekt vorhanden ist. Wenn im QuerySet keine Sortierung definiert ist, wird das Abfrage-Set automatisch nach dem Primärschlüssel sortiert.

list = List.objects.last() gibt Ihnen das letzte Objekt erstellt

0

Ich arbeite an Django-Version ist 1.4.22, weder last noch lastet arbeitet. Mein Weg mit minimalem db Laden zu lösen ist, wie:

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

Diese Funktion als Eingabe query_set akzeptiert.

Sie können diese Funktion dynamisch binden, indem Sie:

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

Dann sollten Sie in der Lage sein, einfach das letzte Objekt dieses letzte Stück zu bekommen.