标签: graphene-python

石墨烯-Django:连接,边和节点的概念

我刚刚开始尝试使用graphene-django / GraphQL,并且对于为graphene-django引入的中继库感到非常困惑。在浏览完菜谱示例(用我自己的模型实现)并运行测试查询后,在POST上,查询将转换为具有边缘和节点的奇怪嵌套对象。这些是什么,他们在做什么?

{
  companies {
    edges {
      node {
       id
     }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

django graphene-python

5
推荐指数
1
解决办法
1452
查看次数

石墨烯 Django 没有 Django 模型?

我已成功使用 Graphene-Django 成功构建了多个 GraphQL 调用。在所有这些情况下,我全部或部分填充了 Django 模型,然后返回我填充的记录。

现在我遇到一种情况,我想返回一些我不想存储在 Django 模型中的数据。这可能与石墨烯有关吗?

罗伯特

python django django-models graphene-python

5
推荐指数
2
解决办法
2507
查看次数

graphql reason-apollo - 递归解析选项

我正在使用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 graphql reason graphene-python reasonml

5
推荐指数
1
解决办法
301
查看次数

Django和Graphene中的枚举始终为null

我在尝试将枚举与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)

接下来,在中 …

python django enums graphql graphene-python

5
推荐指数
0
解决办法
1316
查看次数

“无法查询 CreateUser 类型上的字段‘id’”官方 Graphql 教程

我正在关注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)

graphql graphene-python graphql-python

5
推荐指数
1
解决办法
6905
查看次数

Python Graphene 处理多对多关系

如果这个问题在其他地方得到回答,那么我很抱歉,但是下班后两天,仍然没有雪茄......

我有一个播放器模型:

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)

python django graphql graphene-python graphene-django

5
推荐指数
1
解决办法
3720
查看次数

如何在石墨烯解析器之后使用中间件?

在 Node 中使用 Graphql,您可以在解析器之前之后使用中间件,例如使用Prisma

在Python中,使用Graphene,我只能找到一种使用中间件的方法在解析器

有没有办法在Python中的解析器之后使用中间件?

python graphql graphene-python

5
推荐指数
1
解决办法
2083
查看次数

石墨烯 Graphql - 如何链接突变

我碰巧向 Graphql API(Python3 + Graphene)发送了 2 个单独的请求,以便:

  1. 创建一个对象
  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 中所示)。 …

python-3.x graphql graphene-python graphql-mutation

5
推荐指数
2
解决办法
6406
查看次数

如何序列化石墨烯解析中的嵌套 json?

我正在研究石墨烯库(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 graphql graphene-python

5
推荐指数
0
解决办法
940
查看次数

具有循环依赖的 GraphQL 设计

在我的结构中,我想引入如下所示的循环依赖关系,以避免向后端提交两个单独的查询。有人可以建议如何在 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)

python graphql graphene-python

5
推荐指数
1
解决办法
1843
查看次数