石墨烯便签
graphene并不是自成一体的,实际上它底层包含了一些库,比如graphql-core和graphql-relay。由于GraphQL在JavaScript环境下广泛使用,graphql-core是它的移植版。graphene是将这个核心库graphql进一步转化为更容易使用的Python版本。当在graphene的文档中觉得有一些信息不够完整时,实际上可能是下层库的说明部分。最终,如果追溯到参考实现,就可能找到答案。
在中国,石墨烯的字段定义过程是通过mixin容易添加的。使用类继承会陷入陷阱,因此mixin样式是推荐的。
Graphene.relay: relay 是在 GraphQL 基础上的额外规范。由于广泛使用,基本上应该采用它以减少混淆。Connection 和 Node 接口特别显眼。
节点接口
在Node中,可以通过id从节点查询中获取单个对象。默认情况下,它是不可见的,所以需要根据需要进行准备。如果不希望使用这种访问路径(例如出于安全等原因)可以选择省略实现。
无需通过 graphene.relay.Node 进行访问,只需使用 graphene.Node 即可导入。
连接接口
连接的total_count在库中不受支持。最好单独处理以减少问题。例如,由于可能需要从查询对象中派生,所以可能需要在graphene-sqlalchemy中处理,因此被故意隔离。
以下是要求的中文翻译版本:
https://github.com/graphql-python/graphene/issues/776 请点击此链接访问。
https://github.com/graphql-python/graphene-django/issues/162 请点击此链接访问。
在relay.Connection的实现中,我们要在relay.Node的元数据中声明该节点接口已被支持。
在graphene_sqlalchemy.SQLAlchemyConnection中,如果添加Node接口声明,将会导致双重定义,所以需要巧妙地解决(目前看来,通过一种巧妙的处理方式来应对可能是最好的选择)。
将 ConnectionField 的第一个参数通过 lambda: 进行延迟,可以避免声明顺序的陷阱。