Python 在Django中,有没有一种干净的方法可以对某些用户隐藏模型属性?

Python 在Django中,有没有一种干净的方法可以对某些用户隐藏模型属性?,python,django,Python,Django,我正在尝试在我的应用程序中引入字段级权限,这将有效地对某些用户隐藏/取消模型字段值,同时向其他用户显示它们。用户需要能够执行以下操作: class MyRestrictedModel(HypotheticalMixin, models.Model): public = CharField(max_length=128) restricted = RestrictedCharField( max_length=128, permitted_group

我正在尝试在我的应用程序中引入字段级权限,这将有效地对某些用户隐藏/取消模型字段值,同时向其他用户显示它们。用户需要能够执行以下操作:

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

我想我也许可以把一些东西拼凑起来让它工作起来,但如果有更强大、更为社区所接受的东西,我不愿意做这项工作,所以我想在这里问一下。是否存在这样的情况?

您需要添加属性、方法、组等,以便了解用户是否受到限制。假设您有
用户。是否受限制
属性:

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(...)

当然,您可以添加更多方法,如按组添加
等,甚至可以设置
objects=RestrictManager()
来替换对象默认管理器。

您可能应该使用专门处理详细权限的django包。看到所有这些包了吗。您的权限(具有字段级权限管理)为。但也有其他问题。

我认为这不会解决我的问题。我希望管理员返回所有记录,我只希望这些记录中的一些字段是
None
,而不是在某些用户查看它们时的正确值。好的,所以使用annotate。更新了答案。有趣的是,你能给我一个如何使用
.annotate()
重写字段值的示例吗?django 1.9 annotate也接受非聚合,但我不能设置
.annotate(restricted=“something”)
。它抱怨
注释“restricted”与模型上的字段冲突。
不幸的是,我已经找到了django包,并深入研究了django权限、django规则和django角色权限。这些是唯一声称支持Django包的字段级权限的包。问题是,他们没有一个人这样做。这三种方法中有两种是缺乏文档记录的对象权限方法,django规则是一种非常健壮的对象级权限方法,它甚至不在任何地方使用“字段”一词。。。。这就是我来这里的原因:-(