如何解决用于单个对象解析器的 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,pk):
return ClientContractType.get_node(pk)
远非理想,不过。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。