是否有递归查询 Django 模型 manytomany 字段的有效方法?

问题描述 投票:0回答:2

给定这个模型:

class Role(models.Model):
    title = models.CharField(max_length=255, verbose_name='Role Title')
    parents = models.ManyToManyField("self", symmetrical=False)
    skills = models.ManyToManyField(Skill)

以递归方式获取与此“角色”对象及其父对象相关的所有“技能”对象列表的最有效方法是什么?

例如,如果所讨论的角色对象是“Manager”,它将继承“Team Leader”的技能,而“Team Leader”则继承“Team Member”等的技能

python django django-models django-queryset
2个回答
0
投票

我想你必须一次买很多。

    skills = list(roll.skills.all())
    for parent in parents:
        skills.extend(list(parent.skills.all())

或者

set
而不是
list
如果你只是想要一套独特的技能。

你当然可以把它写成一个模型管理器方法,所以在需要的时候很容易获得。


0
投票

尝试使用辅助函数,如下所示:

class Role(models.Model):
    title = models.CharField(max_length=255, verbose_name='Role Title')
    parents = models.ManyToManyField("self", symmetrical=False)
    skills = models.ManyToManyField(Skill)

    def get_all_skills(self):
        """
        Recursively retrieve all skills of the role and its parents
        """
        all_skills = set(self.skills.all())
        for parent in self.parents.all():
            all_skills.update(parent.get_all_skills())
        return all_skills

然后用这个方法获取一个角色及其父角色的所有技能:

role = Role.objects.get(title='Manager')
all_skills = role.get_all_skills()

这个解决方案避免了多次迭代父级的需要,使其更高效。它还提供了一种方便的方法来获取角色及其父母的所有技能,可以在任何需要的地方调用。

© www.soinside.com 2019 - 2024. All rights reserved.