我正在尝试在我的应用中引入字段级权限,这些权限可以有效地隐藏/取消某些用户的模型字段值,同时向其他用户显示它们。用户需要能够做到这样的事情:
class MyRestrictedModel(HypotheticalMixin, models.Model):
public = CharField(max_length=128)
restricted = RestrictedCharField(
max_length=128,
permitted_groups=("group1",)
)
user1 = User.objects.get(pk=1) # in group1
user2 = User.objects.get(pk=2) # NOT in group 1
model_instance1 = MyRestrictedModel.objects.get(pk=1).restrict(user1)
model_instance2 = MyRestrictedModel.objects.get(pk=1).restrict(user2)
print(model_instance1.public) # "this is public data"
print(model_instance1.restricted) # "this is restricted data"
print(model_instance2.public) # "this is public data"
print(model_instance2.restricted) # None
我想我可能能够共同破解这项工作,但是如果有更强大和社区认可的东西,我讨厌做那项工作,所以我想我会问这里。这样的事情存在吗?
答案 0 :(得分:2)
您需要添加属性,方法,组等,以便了解用户是否受到限制。假设您有user.is_restricted
属性:
class RestrictManager(models.Manager):
def by_user(self,user):
queryset = super(RestrictManager,self).get_queryset()
if user.is_restricted:
queryset = queryset.annotate(field_to_show=None) # field_to_show is a queryset field (not in any model)
else:
queryset = queryset.annotate(field_to_show=secret_field)
return queryset
class MyRestrictedModel(models.Model):
field1 = models.CharField...
restricted_objects = RestrictManager()
在您的代码中:
q = MyRestrictedModel.restricted_objects.by_user(self.request.user)
# Now use q as usual, q.all(), q.get(...), q.filter(...)
您当然可以添加更多方法,例如by_group
等,甚至可以设置objects=RestrictManager()
来替换对象默认管理器。
答案 1 :(得分:0)
可能你应该使用专门处理详细权限的django软件包。请参阅here所有此类软件包。适合您的权限 - 具有字段级权限管理 - 是django-permissions
。但也有其他人。