Django 如何定义权限以便用户只能编辑某些模型层次结构?

Django how to define permissions so users can only edit certain model hierarchies?

如果我有这样的模型..

class Family(Model):
    name = models.CharField()

class Father(Model):
    family = ForeignKey(Family)

class Mother(Model):
    family = ForeignKey(Family)

class Child(Model):
    family = ForeignKey(Family)

Django 自动设置组权限,因此我可以定义可以 edit/create/etc... 家庭模型的组。

如何限制它只允许用户编辑家庭模型的某个实例?因此,如果我希望 'Johnson' 家庭管理员仅有权编辑 'Johnson' 家谱下的内容。

我可以想到两种方法,一种是定义自定义权限,例如 (https://docs.djangoproject.com/en/1.10/topics/auth/customizing/#custom-permissions),但我不知道文档在那里说了什么,而且他们没有很好地解释它。

我也可以考虑在用户模型上添加一个字段并检查它的值,但这样做感觉不对...

我可以想象有两种方法可以实现你想要的,但那是实验性的,我不知道它是否会遵循良好的做法:

1 - Programmatically created permissions :

代号部分基于实例。 例如,使用包含用户可以编辑的实例的代号创建权限:

perm = Permission.objects.create(codename='can_create_'+str(obj.id),
                                 name='can edit instance with id ' + str(obj.id))
user.user_permissions.add(perm)

然后:

if user.has_perm('can_create_' + str(relevant_id)):

2 - ManyToMany relationships as permissions :

可能是您自己的实地想法:

class myModel(models.Model):
    editors = models.ManyToManyField(User, related_name='mymodel_can_edit')

然后只需添加和删除用户可以在其 mymodel_can_edit 字段中删除的实例,就像您在其 user_permissions 字段中管理权限一样。

但我没有测试任何这些解决方案。 如果你尝试一下,你能说说你的想法吗? :)

您可以使用提供此功能的 django 模块。 我个人使用 django-guardian,它使用类似于原始 has_perm 方法的界面提供每个对象的权限。