2016-06-08 86 views
2

我有2場Django的values_list意外行爲

class MyModel: 
    name = charField() 
    code = charField(unique=True) 

這就是所有的模型。沒有其他領域或元類,什麼都沒有..這一切都在這裏。

和MySQL表我有8個條目/行

ID name    code 
------------------------- 
8 Aborted   ABT 
7 Returned   RTC 
6 Delivery-Failed DLF 
5 Delivered   DLV 
4 Out-for-Delivery OFD 
3 Ready-to-Deliver RTD 
2 Order-Placed  OPD 
1 in transit  INT 

這就是手段,我做的第一個條目是(「過境」,「INT」),然後OPD..and等。

所以當我在這個表上使用values_list返回

MyModel.objects.values_list('code', 'name') 

[(u'INT', u'in transit'), (u'OPD', u'Order-Placed'), (u'RTD', u'Ready-to-Deliver'), (u'OFD', u'Out-for-Delivery'), (u'DLV', u'Delivered'), (u'DLF', u'Delivery-Failed'), (u'RTC', u'Returned'), (u'ABT', u'Aborted')] 

這是期待的順序,我的意思是第一項第一和最後的最後一個。

現在,當我做MyModel.objects.values_list('code') 返回

[(u'ABT',), (u'DLF',), (u'DLV',), (u'INT',), (u'OFD',), (u'OPD',), (u'RTC',), (u'RTD',)] 

State.objects.values_list('code', flat=True)返回相同的結果也是如此。

這似乎是隨機的,但它似乎是按字母順序排序的。

這還不是全部, 我甚至試圖通過在過濾器

MyMode.objects.filter(code__in=['DLF', 'RTC', 'ABT'][1:]).values_list('code', 'name') 

切片列表,並將其再次返回一些無序的數據 [(u'ABT', u'Aborted'), (u'RTC', u'Returned')]

現在我想明白爲什麼會這樣。如果它在代碼中,爲什麼django開發者在默認情況下做了這種排序?

PS:我不是從日DOC發現什麼有用的 https://docs.djangoproject.com/en/1.9/ref/models/querysets/#values-list

代碼沒有說什麼太 https://github.com/django/django/blob/master/django/db/models/query.py#L146

PS:我使用Django 1.9.6和MySQL版本14.14 Distrib 5.5.47

+0

您使用的是什麼版本的Django和MySQL?我用Django v1.8.6和PostgreSQL進行了測試,沒有觀察到字母排序 – rawbeans

+0

'django 1.9.6'和'mysql Ver 14.14 Distrib 5.5.47' – Wendy

回答

1

最可能的原因是數據庫返回的默認排序。我不能比我更確定,因爲我不知道是否已經發布完整的模型描述。據我所知,這裏沒有涉及DJANGO的魔法。爲了保證預期的排序,Django依賴模型作者指定的default ordering

這看起來像是目前的most relevant/related SO QA。請看看OP的編輯和接受的答案。

編輯: 好吧,它似乎mysql's default order does depend on either insert order or primary key。數據庫可以自由地實現他們自己的默認順序,這是一件好事,因爲他們可以選擇爲這些情況提供最佳性能。這正是DJANGO模型和其他ORM專門爲模型提供默認排序的原因。

重複,重複(這不能被迭代足夠!) - 來自an answer in this post的引用

在SQL世界中,順序不是一組數據的固有屬性。 因此,你沒有從你的RDBMS保證您的數據按照一定的順序來 回來 - 在一個一致的順序,甚至 - 使用ORDER除非你 查詢您的數據BY子句

要特別因爲SQL的TOP應用於有序的結果,並且沒有明確的排序順序排列RDBMS實現可自由選擇它們自己的並且可能在整個版本中隨機使用一個或even execution to execution(因爲它取決於所討論的RDBMS的查詢計劃實現)。