Как узнать уровень каждого ребенка относительно основного родителя в django-mptt? - PullRequest
0 голосов
/ 08 июня 2018

Я использую приложение django-mptt в своем проекте.Позвольте мне попытаться объяснить проблему.

views.py:

user_profile = Profile.objects.get(user=self.request.user)
referrals = user_profile.get_descendants().filter(level__lte=profile.level + 3)

С помощью следующего кода я показываю потомков текущего пользователя (только 3 уровня)и хочу знать уровень каждого ребенка по отношению к родителю.Фактически в базе данных у этого пользователя может быть дочерний элемент с уровнем более 3.

В шаблоне пользователь A имеет следующее дерево с 3 уровнями

user A
 user B (level 1)
  user C (level 2)
    user D (level 3)

Фактически в dababase пользователь A имеет дерево более чем3 уровень как видите.В моем случае это 5.

user A
 user B (level 1)
  user C (level 2)
    user D (level 3)
      user E (level 4)
        user F (level 5)

Теперь, когда пользователь D открывает свою страницу в шаблоне, он видит своих потомков:

user D
 user E
  user F

Я хочу знать уровень пользователя E и F относительнопользователю D. Как это сделать?

Я пробовал в views.py :

for referral in referrals:
   print(referral.level)

Этот код возвращает мне уровень 4 для пользователя E и уровень 5 дляпользователю F.

1 Ответ

0 голосов
/ 09 июня 2018

Относительный уровень , является уровнем referral минус уровень "текущего" userprofile.Таким образом, мы можем использовать referral.level - userprofile.level.

Если вы хотите аннотировать все эти объекты с помощью relative_level, мы можем использовать ORM Джанго:

from django.db.models import F

(user_profile.get_descendants()
             .filter(level__lte=profile.level + 3)
             <b>.annotate(relative_level=F('level') - profile.level)</b>)

Тогда у всех потомков будет дополнительный атрибут .relative_level, который будет содержать относительный уровень.

...