Django 中的模型层次结构
Model hierarchy in Django
抱歉文字太长
模型给出:
用户
层次结构
class 层次结构(模型):
owner = OneToOneField(User)
subordinates = ManyToManyField(User)
有用户,可以互相邀请。被邀请者依次可以接受或拒绝邀请。
假设 Mark 邀请了 Masha、Katya 和 Dima。玛莎接受了马克的邀请,甚至亲自邀请了科利亚。
在一个选项卡上,您需要显示层次结构。
继续这个例子,马克应该有:
1st level: Masha, Katya, Dima
2nd level: Kolya and other guys
1st level for Mark - those whom he invited.
2nd level - those who were invited by people invited by Mark.
以此类推
告诉我如何实现它 |熟悉什么才能更接近结果
据我了解,您需要一棵树,而不是图表。在这种情况下,为了最大限度地减少数据库查询,您需要对层次结构模型进行现代化改造
- Install django-mptt
- 改变模型
from django.db import models
from django.conf import settings
from mptt.models import MPTTModel, TreeForeignKey
class Hierarchy(MPTTModel):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
owner = TreeForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='subordinates')
class MPTTMeta:
parent_attr = 'owner'
level_attr = 'mptt_level'
order_insertion_by=['user']
- 获取您的列表
from django.shortcuts import get_object_or_404
from .models import Hierarchy
# Get owner
owner = get_object_or_404(Hierarchy, pk=owner_id)
# Get tree users from database
users = Hierarchy.objects.filter(tree_id=owner.tree_id, level__gt=owner.level).select_related('user').order_by('level')
# serialize tree
users_list = [] # list levels users with users
users_on_level = [] # list of users of the current tree level
tree_level = owner.level # current tree level
for user in users:
if user.level > tree_level:
tree_level += 1
users_list.append(users_on_level)
users_on_level = []
users_on_level.append(user)
# output users
for level, users in enumerate(users_list, 1):
print(f"{level} - {', '.join(str(user.username) for user in users) }"
抱歉文字太长
模型给出:
用户
层次结构
class 层次结构(模型):
owner = OneToOneField(User) subordinates = ManyToManyField(User)
有用户,可以互相邀请。被邀请者依次可以接受或拒绝邀请。
假设 Mark 邀请了 Masha、Katya 和 Dima。玛莎接受了马克的邀请,甚至亲自邀请了科利亚。
在一个选项卡上,您需要显示层次结构。
继续这个例子,马克应该有:
1st level: Masha, Katya, Dima
2nd level: Kolya and other guys
1st level for Mark - those whom he invited.
2nd level - those who were invited by people invited by Mark.
以此类推
告诉我如何实现它 |熟悉什么才能更接近结果
据我了解,您需要一棵树,而不是图表。在这种情况下,为了最大限度地减少数据库查询,您需要对层次结构模型进行现代化改造
- Install django-mptt
- 改变模型
from django.db import models
from django.conf import settings
from mptt.models import MPTTModel, TreeForeignKey
class Hierarchy(MPTTModel):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
owner = TreeForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='subordinates')
class MPTTMeta:
parent_attr = 'owner'
level_attr = 'mptt_level'
order_insertion_by=['user']
- 获取您的列表
from django.shortcuts import get_object_or_404
from .models import Hierarchy
# Get owner
owner = get_object_or_404(Hierarchy, pk=owner_id)
# Get tree users from database
users = Hierarchy.objects.filter(tree_id=owner.tree_id, level__gt=owner.level).select_related('user').order_by('level')
# serialize tree
users_list = [] # list levels users with users
users_on_level = [] # list of users of the current tree level
tree_level = owner.level # current tree level
for user in users:
if user.level > tree_level:
tree_level += 1
users_list.append(users_on_level)
users_on_level = []
users_on_level.append(user)
# output users
for level, users in enumerate(users_list, 1):
print(f"{level} - {', '.join(str(user.username) for user in users) }"