Django GraphQL returns 空
Django GraphQL returns null
我有一个 Django GraphQL 应用程序 (graphene_django) 运行 djongo (mongoDB ).
当我尝试列出所有 Twitter 查询时(使用 GraphiQL),它 returns 空数据:
我的查询:
query {
allTwitterQueries {
id,
keyword
}
}
Returns :
{
"data": {
"allTwitterQueries": null
}
}
这是我的 Django 文件:
untitled/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)
untitled/api/models.py
from django.db import models
from django.contrib.auth.models import User
class TwitterQuery(models.Model):
user_key = models.ForeignKey(User, related_name="created_by", on_delete=models.CASCADE, default=0)
keyword = models.TextField(default="null")
active = models.BooleanField(null=True)
created_at = models.BigIntegerField(default=0)
updated_at = models.BigIntegerField(default=0)
count = models.IntegerField(default=0)
def __str__(self):
return self.keyword
untitled/api/schema.py
import graphene
from graphene_django.types import DjangoObjectType
from untitled.api.models import TwitterQuery
class TwitterQueryType(DjangoObjectType):
class Meta:
model = TwitterQuery
class Query(object):
twitter_query = graphene.Field(TwitterQueryType, id=graphene.Int(), keyword=graphene.String(), active=graphene.Boolean())
all_twitter_queries = graphene.List(TwitterQueryType)
def fetch_twitter_queries(self, context):
return TwitterQuery.objects.all()
def fetch_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
我的 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"}}
乍一看,我认为您需要重命名您的解析函数。 Graphene 使用一种模式来查找 resole_x()
,其中 'x' 是架构中字段的名称 (https://docs.graphene-python.org/en/latest/types/objecttypes/#resolvers)。或者,您也可以将 resolver=your_function
传递给 graphene.Field()
,其中 your_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
应该可以解决问题。
你应该再看看文档。尽管它仍然不完美,但它的安静程度有所提高 :)。
希望对你有帮助。
我有一个 Django GraphQL 应用程序 (graphene_django) 运行 djongo (mongoDB ).
当我尝试列出所有 Twitter 查询时(使用 GraphiQL),它 returns 空数据:
我的查询:
query {
allTwitterQueries {
id,
keyword
}
}
Returns :
{
"data": {
"allTwitterQueries": null
}
}
这是我的 Django 文件:
untitled/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)
untitled/api/models.py
from django.db import models
from django.contrib.auth.models import User
class TwitterQuery(models.Model):
user_key = models.ForeignKey(User, related_name="created_by", on_delete=models.CASCADE, default=0)
keyword = models.TextField(default="null")
active = models.BooleanField(null=True)
created_at = models.BigIntegerField(default=0)
updated_at = models.BigIntegerField(default=0)
count = models.IntegerField(default=0)
def __str__(self):
return self.keyword
untitled/api/schema.py
import graphene
from graphene_django.types import DjangoObjectType
from untitled.api.models import TwitterQuery
class TwitterQueryType(DjangoObjectType):
class Meta:
model = TwitterQuery
class Query(object):
twitter_query = graphene.Field(TwitterQueryType, id=graphene.Int(), keyword=graphene.String(), active=graphene.Boolean())
all_twitter_queries = graphene.List(TwitterQueryType)
def fetch_twitter_queries(self, context):
return TwitterQuery.objects.all()
def fetch_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
我的 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"}}
乍一看,我认为您需要重命名您的解析函数。 Graphene 使用一种模式来查找 resole_x()
,其中 'x' 是架构中字段的名称 (https://docs.graphene-python.org/en/latest/types/objecttypes/#resolvers)。或者,您也可以将 resolver=your_function
传递给 graphene.Field()
,其中 your_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
应该可以解决问题。
你应该再看看文档。尽管它仍然不完美,但它的安静程度有所提高 :)。 希望对你有帮助。