标签: graphene-python

Graphene Django - 具有一对多关系外键的变异

我想知道如何正确创建用于创建此 Django 模型的突变:

class Company(models.Model):

    class Meta:
        db_table = 'companies'
        app_label = 'core'
        default_permissions = ()

    name = models.CharField(unique=True, max_length=50, null=False)
    email = models.EmailField(unique=True, null=False)
    phone_number = models.CharField(max_length=13, null=True)
    address = models.TextField(max_length=100, null=False)
    crn = models.CharField(max_length=20, null=False)
    tax = models.CharField(max_length=20, null=False)
    parent = models.ForeignKey('self', null=True, on_delete=models.CASCADE)
    currency = models.ForeignKey(Currency, null=False, on_delete=models.CASCADE)
    country = models.ForeignKey(Country, null=False, on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
Run Code Online (Sandbox Code Playgroud)

如您所见,共有三个外键。对于模型CurrencyCountryParent(self)公司 DjangoObjectType看起来非常简单,如下所示:

class CompanyType(DjangoObjectType):
    class Meta:
        model = Company
Run Code Online (Sandbox Code Playgroud)

最后我的变异类 …

django django-models graphql graphene-python

14
推荐指数
1
解决办法
4881
查看次数

在 Python 中构建 GraphQL 查询字符串的最佳方法

我正在尝试这样做(见标题),但它有点复杂,因为我试图构建的字符串必须具有以下属性:

  • 多线
  • 包含花括号
  • 我想向其中注入变量

使用普通的''''''多行字符串会使注入变量变得困难。使用多个 f 字符串使得注入变量变得容易,但是每个花括号,其中有很多,必须加倍。并且f必须在每行之前添加一个。另一方面,如果我尝试使用format,它也会被所有的花括号混淆。

有没有更好的方法我还没有考虑过?

python graphql graphene-python

12
推荐指数
1
解决办法
3244
查看次数

graphene-django - 如何过滤?

我使用graphen-django构建GraphQL API.我已成功创建此API,但我无法传递参数来过滤我的响应.

这是我的models.py:

from django.db import models

class Application(models.Model):
    name = models.CharField("nom", unique=True, max_length=255)
    sonarQube_URL = models.CharField("Url SonarQube", max_length=255, blank=True, null=True)

    def __unicode__(self):
    return self.name
Run Code Online (Sandbox Code Playgroud)

这是我的schema.py:从graphene_django导入石墨烯从模型导入应用程序导入DjangoObjectType

class Applications(DjangoObjectType):
    class Meta:
        model = Application

class Query(graphene.ObjectType):
    applications = graphene.List(Applications)

    @graphene.resolve_only_args
    def resolve_applications(self):
        return Application.objects.all()


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

我的urls.py:

urlpatterns = [
    url(r'^', include(router.urls)),
    url(r'^admin/', admin.site.urls),
    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
    url(r'^api-token-auth/', authviews.obtain_auth_token),
    url(r'^graphql', GraphQLView.as_view(graphiql=True)),
]
Run Code Online (Sandbox Code Playgroud)

如您所见,我还有一个REST API.

我的settings.py包含:

GRAPHENE = {
    'SCHEMA': 'tibco.schema.schema'
}
Run Code Online (Sandbox Code Playgroud)

我遵循这个: …

python django graphql graphene-python

11
推荐指数
2
解决办法
4206
查看次数

大数据集的 Graphene-python 性能问题

目前使用graphene-python 和graphene-django(和graphene-django-optimizer)。

收到GraphQL查询后,数据库查询在几分之一秒内成功完成;然而,石墨烯在另外 10 多秒内不会发送响应。如果我增加响应中发送的数据,响应时间会线性增加(三倍数据 = 三倍响应时间)。

正在检索的数据由嵌套对象组成,最多 7 层深,但使用优化的查询,这不会影响从数据库检索数据所需的时间,因此我假设延迟与 graphene-python 有关将结果解析为 GraphQL 响应。

我无法弄清楚如何分析执行以确定花费这么长时间的时间——在 Django 上运行 cProfiler 似乎没有跟踪石墨烯的执行。

SQL Query 响应时间是使用 graphene-django-debugger 中间件确定的,结果如下所示:

    "_debug": {
  "sql": [
    {
      "duration": 0.0016078948974609375,
      "isSlow": false,
      "rawSql": "SELECT SYSDATETIME()"
    },
    {
      "duration": 0.0014908313751220703,
      "isSlow": false,
      "rawSql": "SELECT [redacted]"
    },
    {
      "duration": 0.0014371871948242188,
      "isSlow": false,
      "rawSql": "SELECT [redacted]"
    },
    {
      "duration": 0.001291036605834961,
      "isSlow": false,
      "rawSql": "SELECT [redacted]"
    },
    {
      "duration": 0.0013201236724853516,
      "isSlow": false,
      "rawSql": "SELECT [redacted]"
    },
    {
      "duration": 0.0015559196472167969,
      "isSlow": false,
      "rawSql": "SELECT …
Run Code Online (Sandbox Code Playgroud)

django graphql graphene-python graphene-django

11
推荐指数
1
解决办法
581
查看次数

查询GraphQL中的枚举值

假设我有这样的模型

class Order(models.Model):
    STATES = [
        (1, 'Initiate'),
        (2, "Brief"),
        (3, "Planning"),
        (4, "Price Negotiate"),
        (5, "Executing"),
        (6, "Pending"),
        (7, "Completed"),
        (8, "Canceled"),
        (9, "Failed"),
        (10, "Paid"),
    ]

    state = models.PositiveSmallIntegerField(
        choices=STATES,
        default=1
    )
Run Code Online (Sandbox Code Playgroud)

当我将这个模型与其Graphene对象类型的伴侣配对时

class OrderNode(graphene_django.DjangoObjectType):
    class Meta:
        model = Order
        interfaces = (relay.Node,)
Run Code Online (Sandbox Code Playgroud)

OrderState!创建具有名称的枚举类型.

我很关心

  1. 我如何查询枚举
  2. 如何使用Apollo客户端管理React中的枚举

对于第一个问题,我有这个问题

{
  customer(id: "Q3VzdG9tZXJOb2RlOjE=") {
    name
    orders {
      edges {
        node {
          state
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

它给了我一个像A_1和的奇怪的状态值A_2.我期待它给我一些有意义的价值,比如"Initiate".如何获得kv对enum的值?

对于第二个问题,如果我想向用户提供此枚举的可能值列表,我该怎么办?

django graphql graphene-python react-apollo

10
推荐指数
1
解决办法
2500
查看次数

GraphQL,Cassandra和非规范化策略

像Cassandra这样的数据库和像GraphQL这样的方案能很好地协同工作吗?

Cassandra意识形态基于优化查询和非规范化数据的想法.这似乎与GraphQL意识形态没有很好的理解,在这种意识形态中,数据似乎可以在查询的每个级别中访问.

示例:假设我构建了我的Cassandra表,如下所示:

User:
    name
    address
    etc... (many properties)

Group:
    id
    name
    user_name  (denormalized user, where we generally just need the name of a user)
Run Code Online (Sandbox Code Playgroud)

但是使用GraphQL,人们不会完全期望非规范化的用户.

query getGroup {
   group(id: 1) {
     name
     users {
         name
     }
   }
}
Run Code Online (Sandbox Code Playgroud)

所以有两件事:1.)这个GraphQL查询最终会多次命中我们的Cassandra数据库(假设没有缓存).获取组名称和每个用户,我们甚至可以为每个用户点击它.但是,假设我们的解决方案使用一个cassandra调用创建多个User对象.

2.)我们无法真正构建一个带有非规范化和graphql的cassandra惯用数据库,我们可以吗?否则,我们应该期望用户的某些属性不会返回给我们查询.

总结一下这个问题,使用非规范化数据的graphql策略是什么?省略客户认为可以访问的某些属性是否可以接受?例如,客户端尝试访问用户的地址但我们目前没有,因为我们的数据是非规范化的.或者甚至不应该担心非规范化,只是让graphQL使用db和graphql之间的缓存机制进行调用.例如,graphql首先获取组,然后获取组ID的用户数据.

facebook cassandra graphql graphene-python

10
推荐指数
1
解决办法
1358
查看次数

石墨烯-Dango和模型属性

假设一个类似于这个的Django模型:

  class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.PROTECT)
    name = models.CharField(max_length=255)
    other_alias = models.CharField(blank=True,null=True,max_length=255)

    @property
    def profile_name(self):
        if self.other_alias:
            return self.other_alias
        else:
            return self.name
Run Code Online (Sandbox Code Playgroud)

我正在使用Graphene-Django这个项目,我成功地创建了一个描述Profile类型的模式,并且可以通过GraphQL查询正确访问它.但是,我无法看到任何可以使该属性可用的方式.

假设我应该从我的Django模型中删除所有属性风格的逻辑,而只是将GraphQL与模型中的原始信息一起使用,然后在我使用GraphQL数据的地方(例如,在反应使用它的应用程序)?

python django graphene-python

9
推荐指数
1
解决办法
1173
查看次数

如何使用Python使用Github GraphQL API?

我想使用Github GraphQl v4 API从Github访问详细信息.我找到了Graphene库,但我不确定如何使用Python中的个人访问令牌进行身份验证.
我试图在Google上搜索,但找不到任何示例.它是可以创建图形模式的Python库,而不是用于消费它们,我尝试使用`requests'但是失败了.我如何进行身份验证并找到存储库列表?

我使用Github GraphQl资源管理器通过以下代码查找存储库列表:

viewer {
repositories(first: 30) {
  totalCount
  pageInfo {
    hasNextPage
    endCursor
  }
  edges {
    node {
      name
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

python python-2.7 python-3.x graphql graphene-python

9
推荐指数
2
解决办法
7332
查看次数

在运行时石墨烯上创建动态模式

我几乎花了 3 天时间才找到在 python 石墨烯中创建动态模式的方法。我能找到的唯一相关结果是以下链接:https : //github.com/graphql-python/graphene/blob/master/graphene/types/dynamic.py 但我找不到任何相关文档。

整个想法是创建一个动态模式。我想提供一个与 GraphQL 兼容的 API,即使模型没有在代码中定义,用户也可以查询我的内容。换句话说,我想即时创建模型。我不知道该怎么办。

如果你能提供一个例子,那将是一个很大的帮助。

更新 :

我的项目是一个无头 CMS,它具有用户可以创建自己的内容类型的功能,我想提供一个 GraphQL 界面,让一切变得更简单、更灵活。

这是我在 DB 中的内容类型的示例:

{
  "id": "author",
  "name": "Book Author",
  "desc": "",
  "options":[
    {
      "id": "author_faname",
      "label": "Sample Sample",
      "type": "text",
      "required": true,
      "placeholder":"One Two Three Four"
    },
    {
      "id": "author_enname",
      "label": "Sample label",
      "type": "text",
      "required": true,
      "placeholder":"Sample Placeholder"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

这是基于该内容类型在数据库中存储的内容:

{
  "id": "9rqgbrox10",
  "content_type": "author",
  "data":{
    "author_fname":"Jimmy",
    "author_ename":"Hello"
  }
}
Run Code Online (Sandbox Code Playgroud)

现在因为我的模型没有在代码中声明并且它们完全在数据库中,我想即时制作我的模式,我不知道什么是最好的解决方案。我知道应该有一种方法,因为其他 Headless CMS 项目正在提供这种方法。

提前致谢!

python graphql graphene-python

9
推荐指数
1
解决办法
3511
查看次数

在Django Graphene Relay中启用基于PK的过滤,同时保留全局ID

问题

我在我们的GraphQL服务器上将django-graphene与Relay一起使用。该实现在类中强加了全局ID要求,该要求覆盖并隐藏Django的ID字段graphene.relay.Node

结果,我可以这样查询:

{
    allBatches(id:"QmF0Y2hOb2RlOjE=") {
    edges {
      node {
        id
        pk
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

并获得以下响应:

{
  "data": {
    "allBatches": {
      "edges": [
        {
          "node": {
            "id": "QmF0Y2hOb2RlOjE=",
            "pk": 1
          }
        }
      ]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,我失去的是能够按对象本身的原始ID(或PK)字段进行过滤的功能:

{
    allBatches(id:1) {
    edges {
      node {
        id
        pk
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

实际上,我根本无法通过ID过滤对象。我可以想到两种可能的解决方法:1.防止django-graphene-relay劫持和遮蔽该id字段,也许强迫它使用其他字段名称,例如gid 2.查找一种将其包括pk为特殊字段的方法可作为属性和过滤器使用

解决方案1

我在1上没有取得任何进展,因为看起来django-graphene(似乎是中继标准)强加了对该字段的限制id。我看到它id已在多个地方用作魔术字符串,并且似乎没有改变字段名称的标准方法。

解决方案2

在2上,我可以使该属性Mixin像这样工作:

class PKMixin(object): …
Run Code Online (Sandbox Code Playgroud)

python django relay graphql graphene-python

9
推荐指数
1
解决办法
688
查看次数