如何在Graphene中覆盖Django IntegerField选项的输出格式?
我前段时间刚解决过一模一样的问题,graphene-django这个自动把带choices的IntegerField转成Enum的逻辑确实有点恼人,给你两个适配当前版本的靠谱解决思路:
方法1:在DjangoObjectType中显式指定字段类型
这是最直接的方案,针对单个字段单独处理。在定义对应的DjangoObjectType时,手动把score字段指定为graphene.Int类型,直接绕过自动生成的Enum逻辑:
import graphene from graphene_django import DjangoObjectType from .models import Foo class FooType(DjangoObjectType): # 显式声明字段类型为Int,覆盖默认的Enum生成 score = graphene.Int() class Meta: model = Foo fields = ("score",)
修改后再执行你的GraphQL查询,返回的score就会是原始的数字值(比如1、2),而不是"A_1"这类字符串了。
方法2:全局覆盖带choices的IntegerField转换逻辑
如果你项目里有很多这类带choices的IntegerField,不想逐个字段手动指定,可以全局修改graphene-django的字段转换规则:
import graphene from graphene_django.converter import convert_django_field from django.db.models import IntegerField # 注册自定义的IntegerField转换器 @convert_django_field.register(IntegerField) def convert_integer_choices_field(field, registry=None): # 针对带choices的IntegerField,直接返回Int类型 if field.choices: return graphene.Int( description=field.help_text, required=not field.null ) # 无choices的字段沿用默认转换逻辑 return convert_django_field(field, registry)
把这段代码放在项目初始化时会被加载的位置,比如你主应用的apps.py的ready方法里:
from django.apps import AppConfig class YourAppConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'your_app_name' def ready(self): # 导入自定义转换器 import your_app_name.converters
这样所有带choices的IntegerField都会默认输出原始数字,不用再逐个修改ObjectType。
补充说明
graphene-django默认会把带choices的字段自动生成Enum类型,主要是为了在GraphQL schema中提供枚举选项的约束,但对于像你这种存储值和展示值相同的场景,这个自动转换就显得多余了。上面两种方法都能完美覆盖这个默认行为,根据你的项目规模选合适的就行。
内容的提问来源于stack exchange,提问作者Khan Khan
相关产品推荐
相关产品推荐

