2017-02-09 31 views
0

如何將非字段參數添加到石墨烯中的GraphQL查詢中?這是一個用例的例子。我希望能夠做到:在石墨烯中擴展查詢參數/ graphene_django

{ 
    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']) 

它失敗的原因爭論不被接受。我錯過了什麼?

+0

(回覆關於使用Connection和ConnectionField的註釋,現在看起來已被刪除。)您是否介意將一個快速回答顯示如何工作?我查看了relay文檔,並不理解如何將ConnectionField值傳遞給查詢。 –

回答

2

答案結果很簡單。將參數添加到分解器,申報參數的字段的構造,如下所示:然後

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

的參數可以被包括在查詢中,如上所示。