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规则是一种非常健壮的对象级权限方法,它甚至不在任何地方使用“字段”一词。。。。这就是我来这里的原因:-(