django-mptt различный порядок данных на двух машинах с одинаковым кодом и данными - PullRequest
0 голосов
/ 04 апреля 2019

Я использую библиотеку 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(), он возвращается к нормальному алфавитному порядку, но локально на моем компьютере алфавитный порядок не работает.случайным образом помещает новый элемент в родительское дерево.

Я пытался загрузить резервную копию базы данных с моего сервера и восстановить ее локально, но если я запускаю OtherDirectory.objects.rebuild(), данные снова перетасовываются в неправильном порядке.

После некоторого изучения источников django-mptt и отладки моего приложения я обнаружил, что этот набор запросов в django mptt содержит разные данные между моей локальной машиной и сервером с одинаковыми данными и кодом БД, filters и order_by:

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

А теперь я застрял. Почему это может быть?

локальная машина: OS X Mojave. DB: 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

1 Ответ

0 голосов
/ 04 апреля 2019

Узнайте решение.Проблема была в упорядочивании postgresql русскими словами на OS X. Исправьте следующие шаги в этой статье (на русском языке).

...