是否有一种干净的方法来隐藏Django中某些用户的模型属性?

时间:2016-02-10 12:07:31

标签: python django

我正在尝试在我的应用中引入字段级权限,这些权限可以有效地隐藏/取消某些用户的模型字段值,同时向其他用户显示它们。用户需要能够做到这样的事情:

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

我想我可能能够共同破解这项工作,但是如果有更强大和社区认可的东西,我讨厌做那项工作,所以我想我会问这里。这样的事情存在吗?

2 个答案:

答案 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。但也有其他人。