2010-11-09 35 views
4

(我有一个Django 1.1.2和PostgreSQL的开发环境。) 我有两个疑问:查询限制和订单不能在Django一起工作

tables = Table.objects.filter(is_active = True, 
           finishes_at__lt=datetime.datetime.now() 
          ).order_by("-starts_at", "weight")[:20] 

,另一种是

tables = Table.objects.filter(is_active = True, 
           finishes_at__lt=datetime.datetime.now() 
          ).order_by("-starts_at", "weight") 

这两个查询都是相同的,只是第一个查询的末尾有[:20](LIMIT 20)。 但是当我运行这两个查询。我看到结果集有不同的顺序。有没有办法纠正这个问题?

注意: 我在dbshel​​l中运行查询,我看到实际上以不同顺序给出结果的查询。以下是查询产生的Django

SELECT "table_table"."id" FROM "table_table" 
WHERE ("table_table"."is_active" = True 
     AND "table_table"."finishes_at" < '2010-11-09 11:57:48.482720') 
ORDER BY "table_table"."starts_at" DESC, "table_table"."weight" ASC 

,是其中一种限制是

SELECT "table_table"."id" FROM "table_table" 
WHERE ("table_table"."is_active" = True 
     AND "table_table"."finishes_at" < '2010-11-09 11:57:48.482720') 
ORDER BY "table_table"."starts_at" DESC, "table_table"."weight" ASC LIMIT 20 

回答

1

+1的细节,但它听起来有点腥,我认为你居然设法datetime.datetime.now()生产相同的值并捕获SQL,因此请确认您确实传递了相同的值,并且上述SQL实际上已在日志中捕获。

就答案而言,我只能部分地解决它 - 从SQL的角度来看。 这两个SQL在针对相同数据运行时会产生相同的顺序。

你可以计数就可以了。

因此,假设SQL的确来自日志,并且它们运行在相同的数据上,您可能会进一步操纵django端的事情,或者您的测试没有做好。

+0

好的我发现了这个问题。如果表对象具有相同的starts_at和weight值,则结果集结果可能会按不同顺序排列。例如在我的结果集中,我有20行,其中两个具有相同的starts_at和weight值。在这种情况下,他们在不同的结果集中有不同的顺序。为了解决这个问题,我添加了命名属性。现在他们有相同的顺序。 – yilmazhuseyin 2010-11-09 13:03:36