Неожиданное поведение атрибута order_insertion_by в django -mptt? - PullRequest
0 голосов
/ 12 июля 2020

Я создаю CMS, для хранения иерархии страниц я использую django -mptt. Вот упрощенная версия кода.

from django.db import models
from mptt.models import MPTTModel, TreeForeignKey

class Post(MPTTModel):
    title = models.CharField(max_length=50, unique=True)
    parent = TreeForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='children')
    ## some columns are omitted

    def __str__(self):
        return self.name

    class MPTTMeta:
        order_insertion_by = ['title']

В документации django -mptt указано, что order_insertion_by используется для определения естественного порядка объектов. Итак, если я установил order_insertion_by = ['title']. Он упорядочивает все сообщения и дочерние сообщения в порядке возрастания title. Пока все хорошо.

Однако, если я установлю order_insertion_by на id, сообщения будут упорядочены в порядке убывания id. Почему?

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

SELECT "wiki_post"."id", "wiki_post"."title", "wiki_post"."slug", "wiki_post"."tree_id", 
"wiki_post"."level" FROM "wiki_post" 
WHERE NOT ("wiki_post"."post_type" = post) 
ORDER BY "wiki_post"."tree_id" ASC, "wiki_post"."lft" ASC

Как видите, сообщения упорядочиваются tree_id и lft столбец, а не столбец id. Вот чего я хочу. Как я могу этого добиться?

...