Query Limits и Order не могут работать вместе в Django - PullRequest
4 голосов
/ 09 ноября 2010

(у меня есть django 1.1.2 и postgresql в качестве среды разработки.) У меня есть два запроса:

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) в конце. Но когда я запускаю оба этих запроса. Я видел, что наборы результатов имеют разные порядки. Есть ли способ исправить это?

Примечание: Я запускаю запросы в dbshell и вижу, что запросы на самом деле дают результаты в другом порядке. вот запросы, сгенерированные 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 голос
/ 09 ноября 2010

+ 1 для деталей, однако для меня немного странно, что вам действительно удалось получить datetime.datetime.now() для получения того же значения и захвата SQL, поэтому, пожалуйста, подтвердите, что вы действительно передали то же значение и что выше SQL фактически были записаны в журнале.

Что касается ответа, я могу решить его только частично - с точки зрения SQL. Два SQL-кода будут отображать одинаковый порядок при работе с одними и теми же данными.

Вы можете рассчитывать на это.

Таким образом, при условии, что SQL поступают из журнала и что они запускаются с теми же данными, вы либо продолжаете манипулировать вещами на стороне django, либо ваше тестирование не было выполнено хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...