抱歉,我找不到合适的标题,如果你理解了问题,请编辑标题。
我想达到4级层次结构(django Group):Country-Manager,State-Manager,City-Manager和Field-staff。
一个用户一次只能属于一个组,任何用户都可以添加潜在客户。
我有一个名为Lead的模型,我想实现以下层次结构:
" User of higher level (say State-Manager) can view leads added by him and and all entries added by users of lower level (say City-Manager and Field Staff) but can not view entries added by other users of same level or higher lever (say Country-Manager)"
要跟踪谁添加了条目,我将用户和组对象保存为Lead模型中的外键。
请建议任何策略或代码段。
-
p.s:我在Django 1.5上
答案 0 :(得分:0)
我在mixins的帮助下解决了这个问题。 (http://eflorenzano.com/blog/2008/05/17/exploring-mixins-django-model-inheritance/)
我创建了一个Hierarchy类:
class Hierarchy(models.Model):
parent = models.ForeignKey('self',null=True,blank=True)
def get_children(self):
return self._default_manager.filter(parent=self)
def get_descendants(self):
descs = set(self.get_children())
for node in list(descs):
descs.update(node.get_descendants())
return descs
class Meta:
abstract = True
并在名为GroupHirerarchy的类中继承它:
class GroupHierarchy(Hierarchy):
group = models.ForeignKey(Group)
def __unicode__(self):
return self.group.name
现在我可以让一群人的孩子使用 group_object.get_children() 和所有后代: group_object.get_descendants()
现在使用这个我获得了对模型的分级许可:
glist = []
groups = request.user.groups.all()
for group in groups:
try:
group_hierarchy = GroupHierarchy.objects.get(group = group)
group_descendants = group_hierarchy.get_descendants()
for group_descendant in group_descendants:
glist.append(Group.objects.get(name=group_descendant.group))
except:
pass
obj = Model.objects.filter(user_group__in = glist)