gpt4 book ai didi

python - 如何根据 Graphene/Django 上的用户类型限制模型的字段访问?

转载 作者:太空狗 更新时间:2023-10-29 20:46:47 26 4
gpt4 key购买 nike

假设我有一个模型:

class Employee(models.Model):
first_name = models.CharField(max_length=40)
last_name = models.CharField(max_length=60)
salary = models.DecimalField(decimal_places=2)

我希望任何人都能够访问 first_name 和 last_name,但只希望某些用户能够读取工资,因为这是 secret 数据。

然后我想将工资的写入/更新限制为一种甚至不同类型的用户。

如何根据请求用户限制字​​段读/写/更新?

编辑:

这是在 GraphQL API 上下文中。我正在使用 Graphite 烯。我希望在解析器功能中看到可扩展的解决方案。

最佳答案

查询

假设你有

  1. 定义如下的查询
    employees = graphene.List(EmployeeType)
  1. 查询的解析器,例如
    def resolve_employees(self, info, **kwargs):
return Employee.objects.all()

  1. 对名为 can_view_salarycan_edit_salary 的员工模型的权限

然后您需要使用取决于用户的 salary 值定义 EmployeeType。有点像

from graphene_django.types import DjangoObjectType
from myapp.models import Employee

class EmployeeType(DjangoObjectType):
class Meta:
model = Employee

def resolve_salary(self, info):
if info.context.user.has_perm('myapp.can_view_salary'):
return self.salary
return None

重要的一点是,您正在为基于权限值切换的薪水创建自定义 resolve 函数。您不需要为 first_namelast_name 创建任何其他解析器。




突变

Read the documentation first.但是没有进行更新的示例。

简而言之,您可以采用以下方法:

  1. 创建一个方法来在您的Mutation 方法中设置员工
class MyMutations(graphene.ObjectType):
set_employee = SetEmployee.Field()
  1. SetEmployee 创建一个获取 Employee 对象并更新它的方法。某些用户的工资字段被忽略。
class SetEmployee(graphene.Mutation):

class Arguments:
id = graphene.ID()
first_name = graphene.String()
last_name = graphene.String()
salary = graphene.String()

employee = graphene.Field(lambda: EmployeeType)


@classmethod
def mutate(cls, root, info, **args):
employee_id = args.get('employee_id')

# Fetch the employee object by id
employee = Employee.objects.get(id=employee_id)
first_name = args.get('first_name')
last_name = args.get('last_name')
salary = args.get('salary')

# Update the employee fields from the mutation inputs
if first_name:
employee.first_name = first_name
if last_name:
employee.last_name = last_name
if salary and info.context.user.has_perm('myapp.can_edit_salary'):
employee.salary = salary
employee.save()
return SetEmployee(employee=employee)

注意:最初写这个答案时,Graphene Django 中没有 Decimal 字段可用——我通过将字符串作为输入来避免这个问题。

关于python - 如何根据 Graphene/Django 上的用户类型限制模型的字段访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49084322/

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