Порядок результатов Django Queryset - PullRequest
1 голос
/ 16 апреля 2019

У меня проблемы с пониманием того, почему возвращается Queryset в том порядке, в каком он есть. У нас есть список авторов статей, которые хранятся в таблице ManyToMany: articlepage_authors

Мы должны иметь возможность выбирать, по каждой статье, в каком порядке они возвращаются и отображаются.

Например, статья с идентификатором 44918 имеет авторов 13752 («Ли Боддинг») и 13751 («Марк Ли»).

Я вызвал их в оболочке, которая возвращает:

Out[6]: <QuerySet [<User: Mark Lee (MarkLee@uss778.net)>, <User: Lee Bodding (LeeBodding@uss778.net)>]>

Вызов это в postgres: SELECT * FROM articlepage_authors;

показывает, что пользователь Lee Bodding id=13752 сохраняется первым в таблице.

id  | articlepage_id | user_id
-----+----------------+---------
   1 |          44508 |    7781
   2 |          44508 |    7775
   3 |          44514 |   17240
….
 465 |          44916 |   17171
 468 |          44918 |   13752
 469 |          44918 |   13751

Независимо от того, что я пытаюсь, например. удаляя авторов, добавляя «Lee Bodding», сохраняя статью, затем добавляя «Mark Lee», и наоборот - я все еще могу получить только набор запросов, который сначала возвращает «Mark Lee».

Я не уверен, как еще отладить это.

Одним из решений было бы добавить другое поле, определяющее порядок авторов, но я хотел бы сначала понять, что здесь происходит. Кажется, что-то уже определяет порядок, и было бы лучше с этим справиться.

1 Ответ

2 голосов
/ 16 апреля 2019

Вы можете добавить и order_by к вашему набору запросов , чтобы записи отображались в нужном вам порядке.Предупреждение: для оптимизации запросов вам может потребоваться создать индекс для этого поля в целях повышения производительности в зависимости от базы данных:

По умолчанию упорядочены результаты, возвращаемые QuerySetс помощью кортежа упорядочения, заданного параметром ordering в модели Meta.Вы можете переопределить это для каждого QuerySet, используя метод order_by.Пример:

Entry.objects.filter(pub_date__year=2005).order_by('-pub_date', 'headline')

Приведенный выше результат будет упорядочен по убыванию pub_date, затем по headline по возрастанию.Отрицательный знак перед "-pub_date" указывает на нисходящий порядок.Восходящий порядок подразумевается.

Вы соединяете это с дополнительно к заказу по ID "10: *"

.extra(select={
    'creation_seq': 'articlepage_authors.id'
}).order_by("creation_seq")

Если вы используете django> 1.10,Вы можете просто использовать поле без extra:

.order_by('articlepage_authors.id')
...