10

我正在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"
    }
  }
}

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

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]*$'

因此,无论以数字开头,它都会将其转换为“A_...”。

我怎样才能覆盖这个输出?

4

3 回答 3

7

代码注释说

GraphQL 将枚举值序列化为字符串,但在内部,枚举可以用任何类型的类型表示,通常是整数。

因此,对于您的特定情况,您将无法轻松地用整数替换在线值。但是,字符串(“A_1”)表示的实际值在内部和客户端是否仍然是整数(来自字段的描述值)可能并不重要。

通常,尽管您可以通过定义枚举类并添加到DjangoObjectType. 这是使用文档枚举示例的示例...

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

于 2017-06-01T18:11:37.670 回答
4

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

class FooType(DjangoObjectType):
    class Meta:
        model = Foo
        convert_choices_to_enum = False

这里有更多关于设置的信息。

于 2020-06-09T10:16:33.827 回答
1

我自己刚刚碰到这个,另一种方法是将 Meta 之外的字段(使用only_fields)定义为只是 a graphene.Int,然后您可以提供自己的解析器函数并仅返回该字段的值,该值最终将作为一个数字。

我的代码片段(问题字段是resource_type枚举):

class ResourceItem(DjangoObjectType):
    class Meta:
        model = Resource
        only_fields = (
            "id",
            "title",
            "description",
            "icon",
            "target",
            "session_reveal",
            "metadata",
            "payload",
        )

    resource_type = graphene.Int()

    def resolve_resource_type(self, info):
        return self.resource_type
于 2020-05-29T10:27:34.063 回答