webentwicklung-frage-antwort-db.com.de

Django - Das letzte Objekt wird erstellt und gleichzeitig gefiltert

Entschuldigung, ich bin völlig neu in Django und Python.

Ich habe 2 Fragen. Erstens, wie gehe ich vor, um das zuletzt erstellte Objekt (oder den höchsten Wert) in einer Liste von Objekten zu erhalten? Ich weiß zum Beispiel, dass ich folgendes verwenden könnte, um das erste Objekt zu erhalten:

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

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

Zweitens: Kann man gleichzeitig Filter erstellen oder Listen zusammenfassen? Hier ist ein Beispiel:

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

Ich möchte so etwas wie oben, aber eher wie:

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

Was ist die richtige Syntax, falls vorhanden?

29
zdyn

Ich habe das noch nicht ausprobiert, aber ich würde mir den latest () Operator auf QuerySets ansehen:

latest (Feldname = Keiner)

Gibt das neueste Objekt in der .__ zurück. Tabelle nach Datum unter Verwendung des Feldnamens als Datumsfeld angegeben.

In diesem Beispiel wird der neueste Eintrag zurückgegeben in der Tabelle laut der pub_date-Feld:

Entry.objects.latest ('pub_date')

Wenn das Meta Ihres Modells angibt get_latest_by können Sie die .__ weglassen. Feldname Argument an latest () . Django verwendet das in .__ angegebene Feld. standardmäßig get_latest_by.

Wie get () wirft latest () .__ auf. DoesNotExist, wenn ein Objekt nicht mit den angegebenen Parametern existieren.

Hinweis latest () existiert nur für Bequemlichkeit und Lesbarkeit.

Und das model docs auf get_latest_by :

get_latest_by

Options.get_latest_by

Der Name eines DateFields oder DateTimeFields im Modell. Dies gibt das Standardfeld an, das in der neuesten Methode Ihres Model Managers verwendet werden soll.

Beispiel:

get_latest_by = "order_date"

Weitere Informationen finden Sie in den Dokumenten für latest ().

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

47
hughdbrown

das funktioniert!

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

25
Harry

Seit Django 1.6 - Letzter

last()

Funktioniert wie first(), gibt jedoch das letzte Objekt im Abfragesatz zurück.

Gibt das letzte Objekt zurück, das vom Abfragesatz abgeglichen wurde, oder None, wenn kein übereinstimmendes Objekt vorhanden ist. Wenn für das QuerySet keine Reihenfolge definiert ist, wird das QuerySet automatisch nach dem Primärschlüssel sortiert.

list = List.objects.last() gibt Ihnen das zuletzt erstellte Objekt

15
punkrockpolly

Versuchen Sie Folgendes für den größten Primärschlüssel: 

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

Beachten Sie, dass die Verwendung von pk unabhängig vom tatsächlichen Namen des als Primärschlüssel definierten Felds funktioniert.

13
jcdyer

Sie können die Methode count () für einen Abfragesatz verwenden, um die Anzahl der Elemente abzurufen.

list = List.objects.all()
list.count()

Zu filternde Argumente werden "UND" gemeinsam bearbeitet. Wenn Sie OR Filter durchführen müssen, schauen Sie sich die Q-Objekte an . http://docs.djangoproject.com/de/dev/topics/db/queries/#complex-lookups-with-q -Objekte

3
Wade

alternative für das zuletzt erstellte Objekt:

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

Es ist notwendig, einen AssertionError für den Fall hinzuzufügen, wenn sich keine Elemente in der Liste befinden.

except AssertionError:
   ...
0
RolandoAmir

Ich arbeite an Django-Version ist 1.4.22, weder last noch lastet arbeitet .. .. Mein Weg, mit minimaler Db-Ladung 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 dynamisch binden, indem Sie Folgendes tun:

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

Dann sollten Sie in der Lage sein, das letzte Objekt von diesem neuesten PC leicht zu erhalten.

0
Sphynx-HenryAY