Jul*_*tés 7 python django graphene-python
我的工作graphene和graphene-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 _...".
我怎么能覆盖这个输出?
代码评论说
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.
您可以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)
有关该设置的更多信息请参见此处。
| 归档时间: |
|
| 查看次数: |
898 次 |
| 最近记录: |