给定这个模型:
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”等的技能
我想你必须一次买很多。
skills = list(roll.skills.all())
for parent in parents:
skills.extend(list(parent.skills.all())
或者
set
而不是 list
如果你只是想要一套独特的技能。
你当然可以把它写成一个模型管理器方法,所以在需要的时候很容易获得。
尝试使用辅助函数,如下所示:
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()
这个解决方案避免了多次迭代父级的需要,使其更高效。它还提供了一种方便的方法来获取角色及其父母的所有技能,可以在任何需要的地方调用。