2010-09-08 13 views

Odpowiedz

10

Prawdopodobnie najbardziej pythonic sposób:

myset = Customer.objects.filter(<something>).order_by(<something>) 
first, last = myset[0], myset.reverse()[0] 
+0

+1. Zwięzłe i tak, Pythoniczne. –

+1

nie wiedziałem, że możesz użyć .reverse() na queryset, nice! – monkut

+0

za pomocą indeksowania bezpośrednio jest naprawdę pythonic? – Shashank

4

Jaki jest najlepszy, najszybszy sposób, aby dostać się tylko pierwszy i ostatni

Zobaczmy.

customers = Customer.objects.filter(**conditions) 
first = customers.order_by('id')[0] 
last = customers.latest('id') 

Oczywiście jeśli można wymyślić z kwerendy SQL, aby to mogło być wykonywane przy użyciu metody raw() zrobić.

query = "<your query to get first and last>" 
Customer.objects.raw(query) 
+1

You nie trzeba pisać dwa razy: myset = Customer.objects.filter (** conditions); first = myset.order_by ('id') [0]; last = myset..latest ('id') –

+0

@ Tomas: Masz rację oczywiście. Poprawione. –

0

nie jestem całkowicie zaznajomiony z wewnętrznych mechanizmów Django ale Przypuszczam najszybszy sposób, aby to zrobić byłoby:

elements = Customer.objects.filter(<something>) 
first_element = elements[0] 
last_element = elements[-1] 
+1

'last_element = elements [-1]' spowoduje błąd; wykluczające indeksowanie nie jest obsługiwane przez kwerendy. Co ma sens, jeśli myślisz o wydaniu SQL (używając klauzuli "LIMIT") –

+0

Definiowanie first/last_element również nie jest prawdopodobnie konieczne. –

+0

@Manoj masz całkowitą rację. Dobry połów. –

Powiązane problemy