2017-01-27 2 views
1

Я работаю с graphene и graphene-django, и у меня есть проблема с выбором IntegerField. graphene создать Enum, а выход - «A_1», если значение равно 1; «A_2», если значение равно 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. Вот пример использования документации 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' 

, которые вы могли бы добавить в свой DjangoObjectType как

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

Или, если вы хотите, чтобы получить дополнительные фантазии, вы можете создать поле Enum динамически выбор вашего поля в Foo._meta.get_field('score').choices. См. graphene_django.converter.convert_django_field_with_choices.

 Смежные вопросы

  • Нет связанных вопросов^_^