python 有没有有效的方法来递归查询Django模型的多对多字段?

mwkjh3gx  于 2023-03-11  发布在  Python
关注(0)|答案(2)|浏览(160)

给定此模型:

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

递归获取与此“角色”对象及其父对象相关的所有“技能”对象的列表的最有效方法是什么?
例如,如果所讨论的角色对象是“经理”,它将从“团队领导”继承技能,而“团队领导”从“团队成员”等继承技能。

eulz3vhy

eulz3vhy1#

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

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()

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

f45qwnt8

f45qwnt82#

我想你得一次买一批。

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

或者如果你只是想要一套独特的技能,可以用set代替list
当然,您可以将其编写为modelmanager方法,以便在需要时可以轻松地使用它。

相关问题