2009-08-10 10 views
26

Przepraszam, jestem całkowicie nowy w Django i Pythonie.Django - Tworzenie ostatniego obiektu, jednoczesne filtrowanie

Mam 2 pytania. Po pierwsze, w jaki sposób chciałbym uzyskać ostatni utworzony obiekt (lub najwyższy pk) na liście obiektów? Na przykład, wiem, że mogę korzystać z następujących czynności, aby zdobyć pierwszy obiekt:

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

Czy istnieje sposób, aby uzyskać długość List.objects? Próbowałem List.objects.length, ale bez skutku.

Po drugie, czy możliwe jest tworzenie równoczesnych filtrów lub łączenie list? Oto przykład:

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

chcę coś jak wyżej, ale bardziej jak:

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

Jaka jest poprawna składnia, jeśli w ogóle?

Odpowiedz

42

nie próbowałem tego jeszcze, ale ja patrzę na operatora latest() na QuerySets:

najnowszy (nazwa_pola = None)

Zwraca ostatni obiekt w tabeli , według daty, używając pola nazwa_pliku podanego jako pole daty.

tym przykładzie zwraca najnowszy wpis w tabeli, w zależności od dziedziny pub_date:

Entry.objects.latest ('') pub_date

Jeśli Meta Twojego modelu określa get_latest_by, można pozostawić argument o nazwie field_name do najnowszej(). Django użyje domyślnie pola określonego w get_latest_by.

Podobnie jak get(), latest() podnosi DoesNotExist, jeśli obiekt nie ma istnieje z podanymi parametrami.

Notatka najnowsza() istnieje wyłącznie dla wygody i czytelności .

A model docs on get_latest_by:

get_latest_by

Options.get_latest_by

nazwa DateField lub DateTimeField w modelu. Określa domyślne pole do użycia w najnowszej metodzie Twojego Menedżera modelu.

przykład:

get_latest_by = "ORDER_DATE"

Zobacz dokumentację ostatni() więcej.

Edytuj: Wade ma dobrą odpowiedź na temat operatora Q().

+0

Dzięki, Hugh! Zajrzę też w to. – zdyn

+0

Niesamowita odpowiedź =) Dziękujemy! –

+0

@hughdbrown Jak możemy użyć najnowszego szablonu Django? – MegaBytes

12

Dla największego klucza podstawowego, spróbuj tego:

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

pamiętać, że korzystanie pk działa niezależnie od rzeczywistej nazwy pola zdefiniowanego jako klucz podstawowy.

20

to działa!

Model.objects.latest('field') - pole może być identyfikatorem. że będą najnowsze Numer ID

+8

Wygląda trochę jak odpowiedź, którą napisałem cztery miesiące przed twoją, nie? – hughdbrown

+4

Pozdrawiam, nie wzbudzam zaufania do _Nigdy jeszcze tego nie próbowałem. Ta odpowiedź brzmi. –

0

alternatywę dla najnowszego obiektu Utworzono:

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

Konieczne jest dodanie AssertionError dla przypadku, gdy nie ma żadnych przedmiotów na liście.

except AssertionError: 
    ... 
+2

Spowoduje to załadowanie wszystkich modeli z bazy danych. – wieczorek1990

9

Ponieważ Django 1.6 - ostatni

last()

działa jak first(), ale zwraca ostatni obiekt w queryset.

Powoduje zwrócenie ostatniego obiektu dopasowanego przez zestaw pytań lub None, jeśli nie ma pasującego obiektu. Jeśli QuerySet nie ma zdefiniowanego porządku, to zestaw zapytań jest automatycznie sortowany według klucza podstawowego.

list = List.objects.last() daje ostatniego obiektu utworzonego

0

Pracuję na wersji Django jest 01.04.22, ani last ani lastet działa. Moja droga do rozwiązania przy minimalnym obciążeniu db jest jak:

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

Funkcja ta przyjmuje query_set jako wejście.

można powiązać tę funkcję dynamicznie, wykonując:

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

Następnie powinieneś być w stanie uzyskać ostatni obiekt o tej najnowszej pk łatwo.