【问题标题】:DjangoListField analouge for an individual object resolver单个对象解析器的 DjangoListField 类比
【发布时间】:2021-06-10 13:22:03
【问题描述】:

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

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

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。有人遇到过这个问题或知道更好的解决方案吗?

【问题讨论】:

    标签: django graphql graphene-python graphene-django


    【解决方案1】:

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

    远非理想。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-20
      • 2020-03-17
      • 2014-06-24
      相关资源
      最近更新 更多