django - 单个对象解析器的 DjangoListField 类比
问题描述
我正在使用 Django + GraphQL,使用起来非常方便DjangoListField
。它允许我get_queryset
在ObjectType
级别覆盖并确保在那里验证所有权限。以这种方式,我有一个地方可以进行所有权限检查。
但是,每当我需要执行以下操作时:
contract = graphene.Field(ClientContractType,
pk=graphene.ID(required=True))
我还必须在resolve_contract
方法中重复权限验证。我想出了以下解决方案来确保许可并避免重复:
def resolve_contract(self, info, pk):
qs = ClientContract.objects.filter(pk=pk)
return ClientContractType.get_queryset(qs, info).get()
它可以工作,但我希望有某种DjangoObjectField
可以为我封装它,并可能ClientContractType
以某种方式将参数传递给。有人遇到过这个问题或知道更好的解决方案吗?
解决方案
我能想到的最好的方法是将这个逻辑移到ObjectType
类中,定义一个方法(类似于DjangoObjectType
已经实现的)
@classmethod
def get_node(cls, info, id):
queryset = cls.get_queryset(cls._meta.model.objects, info)
try:
return queryset.get(pk=id)
except cls._meta.model.DoesNotExist:
return None
然后,解析器看起来像
def resolve_contract(self, info, pk):
return ClientContractType.get_node(pk)
远非理想,寿。
推荐阅读
- php - 从刀片获取值到模型函数 Laravel
- java - Amazon PA API 5.0 迁移 - 找不到 Maven 开发工具包依赖项(公共存储库)
- azure-data-explorer - 防止分区列出现在导出的数据中
- javascript - 为什么当数组元素相同时,Splice 只删除最后一个元素
- c# - 如何减少调用 OnTriggerEnter 的频率?
- random - 关于sklearn中的mutual_info_classif,所以在特征选择方面对random_state的使用感到困惑
- hive - Hive:在特定行中添加具有重复特定列的值的列?
- css - 旋转时是否可以保持渐变静止
- spring-boot - Spring Boot swagger SocketIO 创建 1 个“全局”连接?或者在每个 API 调用上连接和断开连接?
- javascript - 空格显示为问号