如何知道 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
,它将包含相对级别。
我在我的项目中使用 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
,它将包含相对级别。