首页 > 解决方案 > 单个对象解析器的 DjangoListField 类比

问题描述

我正在使用 Django + GraphQL,使用起来非常方便DjangoListField。它允许我get_querysetObjectType级别覆盖并确保在那里验证所有权限。以这种方式,我有一个地方可以进行所有权限检查。

但是,每当我需要执行以下操作时:

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以某种方式将参数传递给。有人遇到过这个问题或知道更好的解决方案吗?

标签: djangographqlgraphene-pythongraphene-django

解决方案


我能想到的最好的方法是将这个逻辑移到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)

远非理想,寿。


推荐阅读