如何知道 django-mptt 中每个 child 相对于主要 parent 的级别?

How to know level of every child relative to main parent in django-mptt?

我在我的项目中使用 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 个级别)并且想知道每个 child 相对于 parent 的级别。事实上,在数据库中,用户可以拥有级别超过 3 的 child。

在模板中,用户 A 拥有 3 级的下一棵树

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

事实上,如您所见,在数据库中,用户 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)

此代码return 用户 E 为 4 级,用户 F 为 5 级。

相对的水平,就是referral的水平减去的水平"current"userprofile。因此我们可以使用 referral.level - userprofile.level.

如果你想用注释所有这些对象 relative_level,我们可以使用 Django 的 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,它将包含相对级别。