2016-06-08 47 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的查询计划实现)。