覆盖石墨烯中的django选择输出

Jul*_*tés 7 python django graphene-python

我的工作graphenegraphene-django我有一个问题,一个IntegerField与选择.graphene创建一个Enum,如果值为1,则输出为"A_1"; 如果值为2则为"A_2",依此类推.例:

# 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"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我找到了一个转换选择值的函数.

def convert_choice_name(name):
    name = to_const(force_text(name))
    try:
        assert_valid_name(name)
    except AssertionError:
        name = "A_%s" % name
    return name
Run Code Online (Sandbox Code Playgroud)

assert_valid_name有这个正则表达式:

r'^[_a-zA-Z][_a-zA-Z0-9]*$'
Run Code Online (Sandbox Code Playgroud)

因此,无论以数字开头,它都会将其转换为"A _...".

我怎么能覆盖这个输出?

Mar*_*ian 7

代码评论说

GraphQL将Enum值序列化为字符串,但内部Enums可以用任何类型表示,通常是整数.

因此,对于您的特定情况,您无法轻松地用整数替换线上值.但是,如果字符串("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'
Run Code Online (Sandbox Code Playgroud)

然后你可以添加到你的DjangoObjectType喜欢

class FooType(DjangoObjectType):
    score = Episode()
    class Meta:
        model = Foo
Run Code Online (Sandbox Code Playgroud)

或者如果你想获得额外的幻想,你可以从你的领域中选择动态生成枚举字段Foo._meta.get_field('score').choices.见graphene_django.converter.convert_django_field_with_choices.


Mar*_*gan 5

您可以convert_choices_to_enum在 Graphene-Django 模型中将其设置为 False,这会将它们保留为整数。

class FooType(DjangoObjectType):
    class Meta:
        model = Foo
        convert_choices_to_enum = False
Run Code Online (Sandbox Code Playgroud)

有关该设置的更多信息请参见此处