我正在尝试在我的应用程序中引入字段级权限,以有效地对某些用户隐藏/取消模型字段值,同时向其他用户显示它们。用户需要能够执行如下操作:
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
我想我也许可以把一些东西组合在一起来让这个工作正常,但如果有更强大和社区接受的东西可用,我不想做那个工作,所以我想我会在这里问。有这种东西吗?
最佳答案
您需要添加属性、方法、组等,以便了解用户是否受到限制。假设你有 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()
来替换对象默认管理器。
关于python - 有没有一种干净的方法可以对 Django 中的某些用户隐藏模型属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35314819/