You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 21:17:47