django-mptt 在具有相同代码和数据的两台机器上进行不同的数据排序

django-mptt different data ordering on two machines with same code and data

我正在使用 django-mptt 库来创建这样的目录层次结构:

directory_a
   directory_some_name
       directory_a
       directory_b
   directory_some_name
directory_b
   directory_some_name
   directory_some_name

models.py

class BaseDirectory(MPTTModel):
    name = models.CharField(_('Name'), max_length=120)
    parent = TreeForeignKey('self', on_delete=models.CASCADE, null=True,
                            blank=True, related_name='children',
                            verbose_name=_('parent directory'))

    def __str__(self):
        return self.name

    def clean(self):
        # some cleaning
        super().clean()

    def save(self, *args, **kwargs):
        self.clean()
        super().save(*args, **kwargs)

    class MPTTMeta:
        order_insertion_by = ['name']

    class Meta:
        abstract = True


class OtherDirectory(BaseDirectory):
    # directory model from another application
    class Meta:
        verbose_name = _('directory')
        verbose_name_plural = _('directories')

我将此代码部署到服务器并且工作正常(所有项目按 字母顺序插入 ,如果我以某种方式更改它并且 运行 OtherDirectory.objects.rebuild() returns 回到正常的字母顺序。 但是在我的本地机器上 字母排序 不起作用。它随机将新元素放入父树中。

我试图从我的服务器下载数据库备份并在本地恢复它,但是如果我 运行 OtherDirectory.objects.rebuild() 数据再次以错误的顺序打乱。

在对 django-mptt 源代码进行一些研究并调试我的应用程序之后,我发现 django mptt 中的这个查询集在我的本地机器和具有相同数据库数据和代码的服务器之间包含不同的数据,filtersorder_by:

queryset = node.__class__._tree_manager.db_manager(
                node._state.db).filter(filters).order_by(*order_by)

现在我卡住了。为什么会这样?

本地机器:OS X Mojave。数据库:postgresql 9.6.10 和 postgis 2.5.2,python3.7.3,django 2.1.7,django-mptt 0.9.1

服务器:Ubuntu、postgresql 9.6.10 和 postgis 2.5.1 python3.7.1、django 2.1.7、django-mptt 0.9.1

找出解决办法。问题出在 OS X 上按俄语单词排序的 postgresql 中。在 article(俄语)中按以下步骤修复。