Django 中的模型层次结构

Model hierarchy in Django

抱歉文字太长

模型给出:

  1. 用户

  2. 层次结构

    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.

以此类推

告诉我如何实现它 |熟悉什么才能更接近结果

据我了解,您需要一棵树,而不是图表。在这种情况下,为了最大限度地减少数据库查询,您需要对层次结构模型进行现代化改造

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) }"