我刚刚开始尝试使用graphene-django / GraphQL,并且对于为graphene-django引入的中继库感到非常困惑。在浏览完菜谱示例(用我自己的模型实现)并运行测试查询后,在POST上,查询将转换为具有边缘和节点的奇怪嵌套对象。这些是什么,他们在做什么?
{
companies {
edges {
node {
id
}
}
}
}
Run Code Online (Sandbox Code Playgroud) 我已成功使用 Graphene-Django 成功构建了多个 GraphQL 调用。在所有这些情况下,我全部或部分填充了 Django 模型,然后返回我填充的记录。
现在我遇到一种情况,我想返回一些我不想存储在 Django 模型中的数据。这可能与石墨烯有关吗?
罗伯特
我正在使用Reason-Apollo从我的服务器解析一个非常嵌套的GraphQL响应.我无法解析从GraphQL服务器返回的毛茸茸树的选项(我正在使用django-graphene).
这是使用Reason Apollo的GraphQL查询和Reason React模块:
module GroupQuery = [%graphql {|
query GetChatGroup($chatGroupId: ID!){
chatGroup(id: $chatGroupId) {
id
users {
edges {
node {
id
name
isCurrentUser
}
}
}
messages {
edges {
node {
id
text
author {
name
abbreviation
photoUrl
isCurrentUser
}
}
}
}
}
}
|}];
/*eventually will be a reducerComponent*/
let component = ReasonReact.statelessComponent("RechatWindow");
module Query = RechatApollo.Instance.Query;
let parseMessages = chatGroup =>
switch chatGroup {
| Some(chatGroup) =>
switch chatGroup##messages {
| Some(messages) …Run Code Online (Sandbox Code Playgroud) 我在尝试将枚举与Django和Graphene结合使用时遇到一些问题。即使枚举的值保留在SQLite中并且可以正确检索,它仍然导致错误。下面是错误的示例。
{
"message": "Cannot return null for non-nullable field DjangoObject.vanillaEnum.",
"locations": [
{
"line": 10,
"column": 5
}
]
},
Run Code Online (Sandbox Code Playgroud)
我正在将Django 2.0.3和Graphene 2.0.1与Anaconda3 5.0.0和Python 3.6.4一起使用。我设法使用一个简单的示例重现了该错误,该示例在我的GitHub帐户上可用。
在中models.py,我定义了Enum使用该枚举的Python 和Django模型。此处的模型按预期工作(AFAIK),不涉及任何石墨烯依赖项。默认的SQLite数据库似乎也具有正确的值。
models.py
import enum
from django.db import models
@enum.unique
class VanillaEnum(enum.Enum):
RED = enum.auto()
BLUE = enum.auto()
GREEN = enum.auto()
@classmethod
def choices(cls):
return tuple((x, x) for x in cls)
class DjangoModel(models.Model):
name = models.CharField(max_length=20)
vanilla_enum = models.CharField(choices=VanillaEnum.choices(), default=VanillaEnum.GREEN, max_length=20)
def __str__(self):
return f'name={self.name}, vanilla_enun={self.vanilla_enum}'
Run Code Online (Sandbox Code Playgroud)
接下来,在中 …
我正在关注https://www.howtographql.com/graphql-python/4-authentication/上的 graphql-python 教程。但是,我收到 3 个错误,提示“无法在类型“CreateUser”上查询字段“id”。” 我基本上复制了教程中的所有源代码,并且在发布到此处之前仔细检查了我的 Python 代码。我使用了相同版本的 Django、Graphene 和其他包。我使用Windows 10和Python3.7。我怎样才能传递错误?
突变:
mutation {
createUser (
username: "abc",
email: "abc@example.com",
password: "123456"
){
id
username
password
}
}
Run Code Online (Sandbox Code Playgroud)
回复:
{
"errors": [
{
"message": "Cannot query field \"id\" on type \"CreateUser\".",
"locations": [
{
"line": 7,
"column": 5
}
]
},
{
"message": "Cannot query field \"username\" on type \"CreateUser\". Did you mean \"user\"?",
"locations": [
{
"line": 8,
"column": 5
}
]
},
{
"message": "Cannot query field …Run Code Online (Sandbox Code Playgroud) 如果这个问题在其他地方得到回答,那么我很抱歉,但是下班后两天,仍然没有雪茄......
我有一个播放器模型:
class Player(models.Model):
name = models.CharField(max_length=60)
discord_id = models.CharField(max_length=60, null=True)
known_npcs = models.ManyToManyField(NPC)
Run Code Online (Sandbox Code Playgroud)
玩家可以认识很多NPC,而任何NPC都可以被很多玩家认识。
NPC没什么特别的:
class NPC(models.Model):
image = models.ImageField()
name = models.CharField(max_length=50)
description = models.TextField()
Run Code Online (Sandbox Code Playgroud)
谜题的最后一部分是事实,事实是附加到 NPC 的一些信息,但是一个人可以认识一个 NPC,但玩家不一定知道所有与 NPC 相关的事实,因此事实看起来像这样:
class Fact(models.Model):
fact = models.TextField()
known_by = models.ManyToManyField(Player)
npc = models.ForeignKey(NPC, on_delete=models.DO_NOTHING, null=True)
Run Code Online (Sandbox Code Playgroud)
现在在石墨烯中,我想创建一个 Player 和 allPlayers 查询,它会给我这个:
{
allPlayers {
name
knownNPCs {
image
name
description
factsKnown {
fact
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
其中已知的事实只是基于 Fact 对象中的多对多关系的事实。
到目前为止,我创建的内容会返回数据,但不会根据玩家父级过滤事实,只是显示与 npc 相关的所有事实:(
事实图式
class FactType(DjangoObjectType):
class Meta:
model = …Run Code Online (Sandbox Code Playgroud) 我碰巧向 Graphql API(Python3 + Graphene)发送了 2 个单独的请求,以便:
我意识到这可能不符合 Graphql 的“精神”,所以我搜索并阅读了有关嵌套迁移的内容。不幸的是,我还发现这是不好的做法,因为嵌套迁移不是连续的,并且可能会导致客户端由于竞争条件而难以调试问题。
我正在尝试使用顺序根突变来实现考虑嵌套迁移的用例。请允许我向您展示我想象的一个用例和一个简单的解决方案(但可能不是一个好的实践)。很抱歉发了这么长的帖子。
让我们想象一下,我有用户和组实体,我希望从客户端表单更新组,不仅能够添加用户,而且还能够创建一个要添加到组中的用户(如果该用户不存在)。用户的 id 名为 uid(用户 id)和组 gid(组 id),只是为了突出区别。因此,使用根突变,我想象执行如下查询:
mutation {
createUser(uid: "b53a20f1b81b439", username: "new user", password: "secret"){
uid
username
}
updateGroup(gid: "group id", userIds: ["b53a20f1b81b439", ...]){
gid
name
}
}
Run Code Online (Sandbox Code Playgroud)
您注意到我在突变的输入中提供了用户 ID createUser。我的问题是,要进行updateGroup更改,我需要新创建用户的 ID。我不知道如何在 mutate 方法 resolving 内的石墨烯中获取该信息updateGroup,因此我想象在加载客户端表单数据时从 API 查询 UUID。因此,在发送上面的突变之前,在我的客户端初始加载时,我会执行以下操作:
query {
uuid
group (gid: "group id") {
gid
name
}
}
Run Code Online (Sandbox Code Playgroud)
然后,我将在突变请求中使用此查询响应中的 uuid(该值将为b53a20f1b81b439,如上面的第一个 scriptlet 中所示)。 …
我正在研究石墨烯库(https://github.com/graphql-python/graphene),我试图了解如何将嵌套的 json 序列化/返回到石墨烯中并以正确的方式执行查询。
我将在下面插入的代码遵循存储库中可用链接的示例(位于问题末尾)。
import graphene
from graphene.types.resolver import dict_resolver
class User(graphene.ObjectType):
id = graphene.ID()
class Meta:
default_resolver = dict_resolver
class Patron(graphene.ObjectType):
id = graphene.ID()
name = graphene.String()
age = graphene.Int()
user = User
class Meta:
default_resolver = dict_resolver
class Query(graphene.ObjectType):
patron = graphene.Field(Patron)
@staticmethod
def resolve_patron(root, info):
return Patron(**{"id":1, "name": "Syrus", "age": 27, "user": {"id": 2}})
schema = graphene.Schema(query=Query)
query = """
query something{
patron {
id
}
}
"""
if __name__ == "__main__":
result = schema.execute(query) …Run Code Online (Sandbox Code Playgroud) 在我的结构中,我想引入如下所示的循环依赖关系,以避免向后端提交两个单独的查询。有人可以建议如何在 Python 中完成此操作吗?
下面是示例代码:
父级.py
import graphene
class Parent(graphene.ObjectType):
id = graphene.ID()
name = graphene.String()
child= graphene.Field(Child)
Run Code Online (Sandbox Code Playgroud)
孩子.py
import graphene
class Child(graphene.ObjectType):
id = graphene.ID()
name = graphene.String()
parent = graphene.Field(Parent)
Run Code Online (Sandbox Code Playgroud)
测试.py
from parent import Parent
print("TEST")
Run Code Online (Sandbox Code Playgroud)
错误
ImportError: cannot import name 'Parent' from partially initialized module 'parent' (most likely due to a circular import)
Run Code Online (Sandbox Code Playgroud)
更新 以下内容也不起作用(循环导入错误)
import graphene
class Child(graphene.ObjectType):
import app.parent as P
id = graphene.ID()
name = graphene.String()
parent = graphene.Field(P.Parent)
...
import graphene
class Parent(graphene.ObjectType):
import …Run Code Online (Sandbox Code Playgroud) graphene-python ×10
graphql ×8
python ×6
django ×5
enums ×1
python-3.x ×1
reason ×1
reasonml ×1