Как изменить порядок запроса по умолчанию? - PullRequest
3 голосов
/ 09 ноября 2011

Я не хочу, чтобы к запросу применялся какой-либо порядок.Итак, у меня есть QuerySet следующее:

question_obj = Question.objects.filter(pk__in=[100,50,27,35,10,42,68]).order_by()

Однако, когда я получаю результаты, они всегда упорядочиваются по questionID.Я повторяю question_obj, и это результат:

for obj in question_obj:
   obj.questionID

Результат отображается как:

10L
27L
35L
42L
50L
68L
100L

Ответы [ 4 ]

2 голосов
/ 09 ноября 2011

Если вы хотите отображать объекты в том же порядке, что и список первичных ключей, то вы можете использовать in_bulk для создания словаря с ключом pk.Затем вы можете использовать понимание списка для создания списка вопросов.

>>> pks = [100,50,27,35,10,42,68]
>>> questions_dict = Question.objects.in_bulk(pks)
>>> questions = [questions_dict[pk] for pk in pks]
>>> for question in questions:
        print question.pk
100
50
27
35
...
1 голос
/ 09 ноября 2011

Если вы хотите неупорядоченную коллекцию, используйте объект Set Python, описанный здесь: http://docs.python.org/tutorial/datastructures.html#sets

Если вы хотите, чтобы порядок соответствовал списку, который вы передаете в качестве значения для pk__in, вы можете попробовать:

ids = [100,50,27,35,10,42,68]
questions = list(Question.objects.filter(pk__in=ids))
question_obj = sorted(questions, key=lambda x: ids.index(x.id))

РЕДАКТИРОВАТЬ: И потому что совершенно неясно, что вы подразумеваете под «неупорядоченным» в отношении структуры данных, которая по определению упорядочена: случайное упорядочение может быть выполнено с помощью следующего:

.order_by('?')
0 голосов
/ 09 ноября 2011

Вы можете сделать некоторый необработанный SQL (с FIELD ()) в виде:

Упорядочение по порядку значений в предложении SQL IN ()

, котороедолжно позволить вам получить их в порядке, предложенном в списке.

Чтобы запустить пользовательский SQL с ORM:

https://docs.djangoproject.com/en/dev/topics/db/sql/#executing-custom-sql-directly

0 голосов
/ 09 ноября 2011

Люк, используй источник, э, документы! Да, вот и все!

API Django QuerySet - order_by ()

...