Django GraphQL 返回 null

alt*_*tab 1 python django graphql graphene-django

我有一个 Django GraphQL 应用程序 ( graphene_django ) 与 djongo ( mongoDB ) 一起运行 ) )。

当我尝试列出所有 twitter 查询时(使用 GraphiQL)时,它返回空数据:

我的查询:

query {
  allTwitterQueries {
    id,
    keyword
  }
}
Run Code Online (Sandbox Code Playgroud)

回报:

{
  "data": {
    "allTwitterQueries": null
  }
}
Run Code Online (Sandbox Code Playgroud)

这是我的 Django 文件:

无标题/schema.py

query {
  allTwitterQueries {
    id,
    keyword
  }
}
Run Code Online (Sandbox Code Playgroud)

无标题/api/models.py

{
  "data": {
    "allTwitterQueries": null
  }
}
Run Code Online (Sandbox Code Playgroud)

无标题/api/schema.py

import untitled.api.schema
import graphene

from graphene_django.debug import DjangoDebug


class Query(
    untitled.api.schema.Query,
    graphene.ObjectType,
):
    debug = graphene.Field(DjangoDebug, name="_debug")


schema = graphene.Schema(query=Query)
Run Code Online (Sandbox Code Playgroud)

我的 mongoDB 实例中有一项:

{"_id":{"$oid":"5df20401d4e39b1e89223b15"},
"id":{"$numberInt":"1"},
"user_key_id":{"$numberInt":"1"},
"keyword":"greve",
"active":true,
"created_at":{"$numberLong":"1575846000000"},
"updated_at":{"$numberLong":"1575846000000"},
"count":{"$numberInt":"0"}}
Run Code Online (Sandbox Code Playgroud)

Tho*_*idt 5

乍一看,我认为您需要重命名解析函数。Graphene 使用一种模式,它在模式中查找resole_x()“x”是您的字段名称的位置(https://docs.graphene-python.org/en/latest/types/objecttypes/#resolvers)。或者,您也可以传递resolver=your_functiongraphene.Field() whereyour_function可以是任何函数。

Graphene 还提供了一个默认解析器,如果它是一个对象或字典,它会尝试从父级访问属性。由于您的情况并非如此(我们在您的查询的根中),您会null回来,因为没有解决任何问题。

我认为将您的代码调整为此

class Query(object): 
   twitter_query = graphene.Field(TwitterQueryType, id=graphene.Int(), keyword=graphene.String(), active=graphene.Boolean()) 
   all_twitter_queries = graphene.List(TwitterQueryType) 

   def resolve_all_twitter_queries(self, context): 
      return TwitterQuery.objects.all() 

   def resolve_twitter_query(self, context, user_id=None, active=None): 
       if user_id is not None: 
          return TwitterQuery.objects.get(user_id=user_id) 
       if active is not None: 
          return TwitterQuery.objects.get(active=active)
       return None
Run Code Online (Sandbox Code Playgroud)

应该做的伎俩。

你应该再看看文档。尽管它仍然不完美,但它的安静程度有所改善:)。希望能帮到你。