Skip to main content
 首页 » 编程设计

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

2024年10月24日34shangdawei

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

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() 来替换对象默认管理器。