首页 > 解决方案 > Graphql Django 获取嵌套对象属性的最佳方法

问题描述

而不是像这样进行查询

query {
    allObjectC {
        id # self ID()
        nestedB_set {
            id
            nestedA_set {
                id # ID() we want to get
            }
        }
    }
}

新的 Graphql 查询

query {
    allObjectC {
        id # self ID()
        nestedA_id # nested nested ID() we want to get
    }
}

对此有什么最佳实践或想法吗?提前致谢 。

标签: pythondjangographqlrelaygraphene-python

解决方案


我们像这样改变模型 // Models.py

class ObjectA(models.Model):
    ...

class ObjectB(models.Model):
    propertyB = models.ForeignKey(ObjectA, on_delete=models.CASCADE, related_name='nestedB')

class ObjectC(models.Model):
    propertyC = models.ForeignKey(ObjectB, on_delete=models.CASCADE, related_name='nestedC')

    @property # new property created
    def nestedB_nestedA_id(self):
        return self.propertyC.nested_objectB.nested_objectA.id

我们像这样改变graphql模式 // schema.py

class ObjectCNode(DjangoObjectType):

    nestedB_nestedA_id = graphene.Int(source='nestedB_nestedA_id') # as proxy 

    nestedA_id = graphene.ID() # globalID of ObjectANode we want to get

    def resolve_nestedB_nestedA_id(self, info, **kwargs):
        return self.nestedB_nestedA_id

    def resolve_nestedA_id(self, info, **kwargs):
        return relay.Node.to_global_id(ObjectANode._meta.name, self.nestedB_nestedA_id)

现在查询

query {
    allObjectC {
        id # self ID()
        nestedA_id # nested nested ID() we want to get
    }
}

其他人的建议?


推荐阅读