在 graphene/graphene_django 中扩展查询参数

Posted

技术标签:

【中文标题】在 graphene/graphene_django 中扩展查询参数【英文标题】:Extending query arguments in graphene/graphene_django 【发布时间】:2017-06-27 18:40:42 【问题描述】:

如何在石墨烯的 GraphQL 查询中添加非字段参数?这是一个用例的示例。我希望能够做到:


  hsv(h: 40, s: 128, v: 54) 
    r
    g
    b
    name

使用这个 Django 模型:

from django.db import models
from django.core.validators import MinValueValidator, MaxValueValidator,

class Color(models.Model):
    name = models.CharField(
        "name",
        max_length=24,
        null=False, blank=False)
    r = models.IntegerField(
        "red", null=False, blank=False,
        validators=[MinValueValidator(0), MinValueValidator(255)]
    )

    g = models.IntegerField(
        "green", null=False, blank=False,
        validators=[MinValueValidator(0), MinValueValidator(255)]
    )

    b = models.IntegerField(
        "blue", null=False, blank=False,
        validators=[MinValueValidator(0), MinValueValidator(255)]
    )

还有这个 GraphQL 对象类型和基于它的查询:

from graphene import ObjectType, IntegerField, Field, relay
from graphene_django import DjangoObjectType

from .django import Color
from colorsys import hsv_to_rgb

class ColorNode(DjangoObjectType):
    r = IntegerField()
    g = IntegerField()
    b = IntegerField()

    class Meta:
        model = Color

class Query(ObjectType):
    rgb = relay.node.Field(ColorNode)
    hsv = relay.node.Field(ColorNode)
    named = relay.node.Field(ColorNode)

    def resolve_rgb(self, args, context, info):
        if not all(map(lambda x: x in args, ['r', 'g', 'b'])):
            # Arguments missing
            return None
        return Color.objects.get(**args)

    def resolve_hsv(self, args, context, info):
        if not all(map(lambda x: x in args, ['h', 's', 'v'])):
            # Arguments missing
            return None

        r, g, b = hsv_to_rgb(args['h'], args['s'], args['v'])
        return Color.objects.get(r=r, g=g, b=b)

    def resolve_named(self, args, context, info):
        if not 'name' in args:
            # Arguments missing
            return None
        return Color.objects.get(name=args['name'])

失败是因为参数不被接受。我错过了什么?

【问题讨论】:

(回复关于使用 Connection 和 ConnectionField 的评论,该评论现在似乎已被删除。)您介意快速回答一下它是如何工作的吗?我查看了中继文档,但不明白如何将 ConnectionField 值传递到查询中。 【参考方案1】:

答案很简单。要向解析器添加参数,请在字段的构造函数中声明参数,如下所示:

rgb = relay.node.Field(ColorNode,
    r=graphene.String(),
    g=graphene.String(),
    b=graphene.String())
hsv = relay.node.Field(ColorNode,
    h=graphene.String(),
    s=graphene.String(),
    v=graphene.String()))
named = relay.node.Field(ColorNode,
    name=graphene.String())

然后可以将参数包含在查询中,如上所示。

【讨论】:

他们改变了它的工作方式吗?这似乎不再起作用(当我打印我的架构时,我仍然只有customer(id: ID!): Customer)。即使我使用graphene.relay.Node.Field(Customer, login=graphene.String()) 创建了我的字段。我错过了什么? (石墨烯版本:2.1.8)。 In the code 看起来应该可以,但不知道为什么不行。 在中继中也不适合我,只在原生石墨烯领域。您显示的链接似乎只是后者。 这里可能对relay.Node.Fieldrelay.node.Field 之间的区别有些混淆。据我所知,前者是一个不处理额外参数的 Relay 字段,而后者是一个普通的旧字段(但没有中继 ID)。

以上是关于在 graphene/graphene_django 中扩展查询参数的主要内容,如果未能解决你的问题,请参考以下文章

秋的潇洒在啥?在啥在啥?

上传的数据在云端的怎么查看,保存在啥位置?

在 React 应用程序中在哪里转换数据 - 在 Express 中还是在前端使用 React?

存储在 plist 中的数据在模拟器中有效,但在设备中无效

如何在保存在 Mongoose (ExpressJS) 之前在模型中格式化数据

如何在保存在 Mongoose (ExpressJS) 之前在模型中格式化数据