首页 > 解决方案 > 结合 DjangoObjectType 和 ObjectType - Django, GraphQL

问题描述

我正在尝试将 DjangoType 与 ObjectType 结合起来。

我有模型:


class Scenario(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(max_length=50)

class Result(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    scenario = models.ForeignKey(
        'optimiser.Scenario',
        on_delete=models.CASCADE,
        related_name='result'
    )
    data = JSONField()

我要做的是使用结果模型的外键查询场景

在我的架构中,我有:

class JsonClass(ObjectType):
    key = graphene.String()
    header = graphene.String()

class Result(ObjectType):
    id = graphene.Int()
    data = graphene.Field(JsonClass)  

class ScenarioJson(ObjectType):
   key = graphene.String()
   value = graphene.String()

class ScenarioData(ObjectType):
    id = graphene.Int()
    name = graphene.String()
    data = graphene.Field(ScenarioJson)
    result = graphene.Field(Result)

为了测试它如何与 DjangoObjectType 一起工作,我得到了所有 Result 所以我想将它实现到 ObjectType

class ScenarioType(DjangoObjectType):
    class Meta:
        model = Scenario

我的查询:

class Query:
     scenario = graphene.Field(ScenarioData, id=graphene.Int()) 
     def resolve_scenario(self, info, **kwargs): 
        return Scenario.objects.get(id=kwargs.get('id'))

所以基本上我得到的是:

query {
    scenario(id: 100) {
     id, // 100
     name, // Scenario1
     data: {
         key, // scenario key1
         value // value key1
     },
     result {
       id // null
       data // null
     }
    }
}

当我将 ScenarioType 与 DjangoObjectType 一起使用时,我得到了所有结果,但我无法查询 JSON

query {
    scenario(id: 100) {
     id, // 100
     name, // Scenario1
     data: "{'key' : 'scenario key1', ..}" // string 
     result {
       id // 12
       data // "{'key1': 'ke2'}"
     }
    }
}

所以我想知道如何在 ObjectType 中实现 DjangoObjectType?

标签: jsondjangoparsinggraphene-python

解决方案


我认为您应该为此使用 GenericScalar 。看看这个 GitHub 帖子:

https://github.com/graphql-python/graphene-django/issues/303#issuecomment-440450677


推荐阅读