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
相关产品推荐
相关产品推荐

