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

Django自定义字段无法创建MySQL enum字段,执行migrations报错

解决Django自定义Enum字段MySQL语法错误问题

你遇到的问题根源很清晰——MySQL的ENUM类型要求枚举值必须用**单引号(或双引号)**包裹,而你自定义的CharMaxlength25Field返回的db_type里,android和ios没有加引号,直接导致SQL解析时触发语法错误。

错误原因拆解

你当前代码返回的数据库类型是:

return 'enum(android,ios)'

但MySQL规范的ENUM语法要求枚举值必须被引号包裹,正确的格式应该是:

enum('android', 'ios')

缺少引号就会触发1064语法错误提示。

修正后的代码

只需要给枚举值加上单引号就能解决问题:

class CharMaxlength25Field(models.Field):
    def db_type(self, connection):
        # 给枚举值添加上单引号
        return "enum('android', 'ios')"

class Search(models.Model):
    class Meta:
        db_table = 'search'
    city_name = CharMaxlength25Field()

顺便提一句,按照Python的命名规范,模型类名建议用大驼峰写法(Search而非search),虽然不影响功能,但更符合通用编码习惯。

额外推荐:使用Django原生枚举支持

如果你的Django版本在3.0及以上,其实完全可以不用自定义字段,直接用Django内置的models.TextChoices配合CharField实现枚举功能,这更符合Django的最佳实践,还能自带选择项验证等特性:

class PlatformChoices(models.TextChoices):
    ANDROID = 'android', 'Android'
    IOS = 'ios', 'iOS'

class Search(models.Model):
    class Meta:
        db_table = 'search'
    city_name = models.CharField(max_length=25, choices=PlatformChoices.choices)

执行迁移时,Django会自动在MySQL中生成带正确引号的ENUM字段,省心又规范。

内容的提问来源于stack exchange,提问作者Mrugesh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:38:09