Django - Erster letztes Objekt erstellt, gleichzeitige Filter
-
12-09-2019 - |
Frage
Entschuldigt, ich bin völlig neu zu Django und Python.
Ich habe 2 Fragen. Erstens: Wie würde ich mich über das letzte Objekt erstellt bekommen (oder höchste pk) in einer Liste von Objekten? Zum Beispiel weiß ich, dass ich die folgenden verwenden könnte das erste Objekt zu bekommen:
list = List.objects.all()[0]
Gibt es eine Möglichkeit, die Länge von List.objects zu bekommen? Ich habe versucht, List.objects.length aber ohne Erfolg.
Zweitens ist es möglich, die gleichzeitigen Filter oder kombinieren Listen zu erstellen? Hier ein Beispiel:
def findNumber(request, number)
phone_list = Numbers.objects.filter(cell=number)
Ich mag so etwas wie die oben, 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?
Lösung
Ich habe das noch nicht ausprobiert, aber ich würde Blick auf die QuerySets :
neueste (field_name = None)
Gibt das letzte Objekt in der Tabelle, nach Datum, mit dem field_name zur Verfügung gestellt, wie das Datumsfeld.
In diesem Beispiel wird den neuesten Eintrag in der Tabelle nach dem pub_date Feld:
Entry.objects.latest ( 'pub_date')
Wenn Meta Gibt das Modell get_latest_by, können Sie weglassen, die field_name Argument neueste (). Django wird das Feld angegeben verwendet in get_latest_by standardmäßig aktiviert.
Wie get (), neueste () wirft DoesNotExist, wenn ein Objekt nicht der Fall ist existiert mit den angegebenen Parametern.
Beachten Sie neueste () existiert rein Bequemlichkeit und Lesbarkeit.
Und das Modell docs auf get_latest_by :
get_latest_by
Options.get_latest_by
Der Name einer Datefield oder Datetimefield im Modell. Dies gibt das Standardfeld in Ihrem Modell-Manager neueste Methode verwenden.
Beispiel:
get_latest_by = "order_date"
SieheSie die Dokumentation für die neueste () für mehr.
Edit:. Wade hat eine gute Antwort auf Q () Operator
Andere Tipps
das funktioniert!
Model.objects.latest('field')
- Feld-ID sein. das wird die letzte id sein
Für den größten Primärschlüssel, versuchen Sie dies:
List.objects.order_by('-pk')[0]
Beachten Sie, dass pk
Verwendung funktioniert unabhängig von den tatsächlichen Namen des Feldes als Primärschlüssel definiert ist.
Da Django 1.6 - letzter
last()
Funktioniert wie first()
, sondern gibt das letzte Objekt in der queryset.
Gibt das letzte Objekt der queryset angepasst oder None
, wenn kein passendes Objekt ist. Wenn die QuerySet hat keine Reihenfolge definiert ist, dann wird die queryset automatisch vom Primärschlüssel bestellt werden.
list = List.objects.last()
gibt Ihnen das letzte Objekt erstellt
Sie können die count () -Methode auf einer Set-Abfrage verwenden, die die Anzahl der Einzelteile erhalten.
list = List.objects.all()
list.count()
Argumente zum Filter sind "AND" ed zusammen. Wenn Sie tun oder Filter zu buchen, Q-Objekte. http: //docs.djangoproject .com / de / dev / Themen / db / Abfragen / # Komplex-Lookups-mit-q-Objekte
Alternative für das letzte Objekt erstellt:
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:
...
Ich arbeite an Django-Version ist 1.4.22, weder last
noch lastet
arbeitet.
Mein Weg mit minimaler 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 akzeptiert query_set als Eingabe.
Sie können diese Funktion binden dynamisch, indem Sie:
import types
List.objects.latest = types.MethodType( latest, List.objects )
Dann sollten Sie in der Lage sein, das letzte Objekt dieses letzte Stück leicht zu erhalten.