Проблема с методом get_children () при использовании TreeManager.Неправильный результат - PullRequest
0 голосов
/ 21 февраля 2019

Я столкнулся со странной проблемой с использованием TreeManager

Вот мой код:

# other imports
from mptt.models import MPTTModel, TreeForeignKey
from mptt.managers import TreeManager

class SectionManager(TreeManager):
    def get_queryset(self):
       return super().get_queryset().filter(published=True)

class Section(MPTTModel):
    published = models.BooleanField(
    default=True,
    help_text="If unpublished, this section will show only"
              " to editors. Else, it will show for all."
)

    objects = TreeManager()
    published_objects = SectionManager()

Когда я тестирую его.Я получаю следующие правильные результаты:

# show all objects
Section.objects.count()  # result is correct - 65
Section.objects.root_nodes().count() # result is correct - 12

# show published objects, just one is not published.
Section.published_objects.count() # result is correct - 64
Section.published_objects.root_nodes().count()  # result is corrct - 12

Но один дочерний элемент корня не опубликован и не отображается в результатах.Вот тест:

for root in Section.objects.root_nodes(): 
    print(f"root_section_{root.id} has {root.get_children().count()} children") 

    # results ...
    root_section_57 has 13 children # correct - 13 items
    # ... more results

for root in Section.published_objects.root_nodes(): 
    print(f"root_section_{root.id} has {root.get_children().count()} children") 

    # results ...
    root_section_57 has 13 children # WRONG - should be only 12 children
    # ... more results

Возможно, я чего-то не понимаю или, возможно, я обнаружил ошибку ??Есть идеи?

ПРИМЕЧАНИЕ: Эта проблема была опубликована на странице вопросов django-mptt github по адресу: https://github.com/django-mptt/django-mptt/issues/689

1 Ответ

0 голосов
/ 29 марта 2019

https://github.com/django-mptt/django-mptt/blob/master/mptt/managers.py

Вы отменяете неправильный вызов функции.root_nodes() Позвоните ._mptt_filter()

    @delegate_manager
    def root_nodes(self):
        """
        Creates a ``QuerySet`` containing root nodes.
        """
        return self._mptt_filter(parent=None)

А ваш _mptt_filter не получил никаких данных qs.

    @delegate_manager
    def _mptt_filter(self, qs=None, **filters):
        """
        Like ``self.filter()``, but translates name-agnostic filters for MPTT
        fields.
        """
        if qs is None:
            qs = self
        return qs.filter(**self._translate_lookups(**filters))

Теперь вам нужно настроить его в зависимости от вашего варианта использования.

Надеюсь, это поможет

...