Задать вопрос

Как настроить фильтр в админке?

Использую модуль django MPTT, при указании фильтра выводит записи только текущего уровня дерева, если у текущего узла дерева есть дочерние узлы у которых есть записи, то он их не выводит.
class Section(MPTTModel):
    section_text = models.CharField(verbose_name='Название раздела', max_length=100)
    parent = TreeForeignKey(verbose_name='Родительский Раздел', to='self', null=True, blank=True, related_name='children')

class Question(models.Model):
    section = models.ForeignKey(Section,verbose_name='Родительский раздел')
    question_text = HTMLField(verbose_name='Описание вопроса')


admin.py
class QuestionAdmin(admin.ModelAdmin):
    list_filter =(
        ('section', TreeRelatedFieldListFilter),
    )


Например имеется такое дерево
7bf669b941c2406db40a056092cb14f8.png
К узлу уровня 3 привязаны записи из Question, если выбрать узлы уровня 1 или 2, то записи узла 3 не выводятся, если выбрать уровень 3 то записи отображаются, т.е. отображаются записи только текущего узла, если у текущего узла есть дочерние узлы уровня ниже, то записи принадлежащие им не отображаются.
  • Вопрос задан
  • 1774 просмотра
Подписаться 3 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
un1t
@un1t
Тебе нужно написать свой кастомный фильр. Вот документация как создать свой фильтр.
https://docs.djangoproject.com/en/1.11/ref/contrib...

В фильтре тебе нужно написть свой queryset (sql запрос).
Чтобы понять какой запрос писать тебе нужно прочитать про nested sets.

Выбор потомков:
SELECT id, name, level FROM my_tree WHERE left_key >= $left_key AND right_key <= $right_key ORDER BY left_key


Можно также посмотреть исходники метода get_descendants из mptt
https://github.com/django-mptt/django-mptt/blob/ma...

Должно получиться как-то так:
section = get_objects_or_404(Section, id= request.GET.get ...

Section.objects.filter(
    tree_id=section.tree_id
    left__gte=section.left,
    left__lte=section.right
).order_by('left')
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы