我有以下Python代碼:Django的查詢集。去年()方法返回不正確元件
models.py
class Person(models.Model):
first_name = models.CharField(max_length=32, null=True, blank=True)
last_name = models.CharField(max_length=64, null=True, blank=True)
order = models.PositiveSmallIntegerField(null=True, blank=True)
我有兩個人分別加入作爲Persons
名爲「人1」和「人2」,。他們都具有1
views.py
def get_people():
people = Person.objects.order_by('order')
print(people)
for p in people:
print(p)
if p == people.last():
print ('Last Person')
相同的順序這裏的結果:
>>> get_people()
[<Person: Person 1>, <Person: Person 2>]
<Person 1>
u'Last Person'
<Person 2>
花了一點挖,但我發現這個結果和根本原因。
>>> people = Person.objects.order_by('order')
>>> print(people)
[<Person: Person 1>, <Person: Person 2>]
>>> print(people.first())
<Person 1>
>>> print(people.last())
<Person 1>
>>> people.first() == people.last()
True
>>> people[0]
<Person 1>
>>> people[1]
<Person 2>
我看了看源代碼,它出現在最後一個()方法只是運行reverse()
與我選擇相同的排序。由於這兩個元素具有相同的順序號1,所以反方法返回與原始列表完全相同的列表,假設因爲當對逆向排序時,同樣的規則適用於在一個領帶中具有最低記錄ID的元素是第一個,而是真正扭轉已經檢索的列表。我不明白他們爲什麼不只是取得已經檢索到的元素列表並從索引中獲取最後一個元素。我嘗試使用[-1]負指數來得到它,但是沒有實現並引發異常。
那麼有人可以解釋爲什麼這樣編碼嗎?如果您的某些元素與所訂購的房產共享相同的價值,則可能會產生問題。特別是如果通過對last()的後續調用來多次訪問queryset。這是爲了表現還是我沒有看到其他問題?相反,在這個用例使用最後的()方法,我只是在做這種比較,而不是:
if p == people[len(people) - 1]:
這工作。在這種情況下,我知道這些人並不是空的,所以我們不會得到IndexError - 如果它是空的,代碼將永遠不會在循環中執行。一般情況下可能是:
l = len(people)
return None if l == 0 else return people[l -1]
或者:
try:
l = len(people)
return people[l - 1]
except IndexError:
return None
你能分享這種行爲的一些見解,請? Django文檔中唯一說明last()方法與first()類似,但返回查詢集的最後一個元素。在這種情況下,它不像描述的那樣運行。這種行爲讓我感到困惑。我認爲它只是從當前列表中取出最後一個元素,而不是創建一個新的反向列表並獲取第一個元素。
在此先感謝...
你爲什麼不定義一個更好的排序?你有它的方式他們是一個領帶,所以這裏的第一個和最後一個想法是沒有意義的.. – wim
這只是一個例子。人們在添加時應該被正確地命令,但不知怎的,他們不知所措。在可能具有相同記錄的多個記錄的字段上進行訂購時,有許多實際示例。說出生日期。 – Furbeenator