Django models 在graphene/graphene_django中扩展查询参数

Django models 在graphene/graphene_django中扩展查询参数,django-models,graphql,graphene-python,Django Models,Graphql,Graphene Python,如何向graphene中的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.Mod

如何向graphene中的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'])

它失败是因为参数不被接受。我遗漏了什么?答案很简单。要向解析器添加参数,请在字段的构造函数中声明参数,如下所示:

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())

然后,这些参数可能会包含在查询中,如上图所示。

(回复关于使用连接和连接字段的评论,该字段现在似乎已被删除。)您是否介意快速给出一个答案,说明这是如何工作的?我查看了中继文档,不知道如何将ConnectionField值传递到查询中。它们是否改变了它的工作方式?这似乎不再有效(当我打印模式时,我仍然只有
客户(id:id!):客户
)。尽管我使用
graphene.relay.Node.field(客户,login=graphene.String())创建了字段
。我错过了什么?(石墨烯版本:2.1.8)。它看起来应该能工作,但不确定为什么不能。继电器也不能工作,只能在天然石墨烯领域。您显示的链接似乎正是后者。这里的
relay.Node.Field
relay.Node.Field
之间的区别可能有些混淆。就我所知,前者是一个中继字段,它不处理额外的参数,而后者是一个普通的旧字段,它处理额外的参数(但没有中继ID)。