2017-01-27 3 views
1

私はgraphenegraphene-djangoを使っていますが、選択肢にはIntegerFieldという問題があります。 grapheneEnumを作成し、値が1の場合は出力が「A_1」になります。値が2の場合は「A_2」、以下同様です。例:グラフェンでdjangoの選択肢を上書きする

# model 
class Foo(models.Model): 
    score = models.IntegerField(choices=((1, 1), (2, 2), (3, 3), (4, 4), (5, 5))) 

# query 

query { 
    foo { 
     score 
    } 
} 

# response 

{ 
    "data": { 
    "foo": { 
     "source": "A_1" 
    } 
    } 
} 

選択値を変換する関数が見つかりました。

def convert_choice_name(name): 
    name = to_const(force_text(name)) 
    try: 
     assert_valid_name(name) 
    except AssertionError: 
     name = "A_%s" % name 
    return name 

そしてassert_valid_nameは、この正規表現がありますので

r'^[_a-zA-Z][_a-zA-Z0-9]*$' 

、番号で始まる何でも、それは "_..." に変換されます。

この出力をどのように上書きできますか?

答えて

1

コードのコメントは

GraphQLしかし、内部列挙型 は整数しばしば、タイプのいずれかの種類で表現することができ、文字列として列挙型の値をシリアル化し言います。

特定のケースでは、ワイヤー値を整数で簡単に置き換えることはできません。しかし、文字列( "A_1")によって表される実際の値が依然として内部的に、そしてクライアント側(フィールドの記述値から)にあるかどうかは関係ありません。

一般的には、列挙型クラスを定義し、DjangoObjectTypeの定義を追加することで、選択肢のあるフィールドに対してここでは文書列挙の例を使用した例が...

あなたが

class FooType(DjangoObjectType): 
    score = Episode() 
    class Meta: 
     model = Foo 

のようなあなたのDjangoObjectTypeに追加することができますまたはあなたは余分な空想を取得したい場合は、から動的にenumフィールドを生成することができます

class Episode(graphene.Enum): 
    NEWHOPE = 4 
    EMPIRE = 5 
    JEDI = 6 

    @property 
    def description(self): 
     if self == Episode.NEWHOPE: 
      return 'New Hope Episode' 
     return 'Other episode' 

ですフィールドの選択肢はFoo._meta.get_field('score').choicesです。 graphene_django.converter.convert_django_field_with_choicesを参照してください。

関連する問題