gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:18:54 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com