Я использую библиотеку 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