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

Django:如何用枚举设置Model.CharField默认值?迁移报错求助

解决Django迁移时的AttributeError: module 'library.models' has no attribute 'FontSize'问题

你遇到的问题核心在于嵌套枚举类的引用逻辑错误和default值的设置方式不对,咱们一步步拆解解决:

1. 问题根源分析

你在字段定义里写了default=library.models.FontSize('Normal'),但FontSize是嵌套在Book模型内部的枚举类——Django加载模型模块时,Book类还没完成初始化,外部无法通过library.models直接访问这个嵌套类。另外,枚举类型的默认值应该用枚举成员(比如FontSize.MID),而不是去实例化枚举类。

2. 修正字段定义

把你的font_size字段改成如下写法:

font_size = models.CharField(
    choices=FontSize.choices(),
    default=FontSize.MID,
    max_length=10
)

因为FontSize是Book类内部的嵌套类,在类内部可以直接用FontSize引用;同时default直接使用枚举成员,不要去实例化枚举类。

3. 确保ChoiceEnum基类实现正确

你的ChoiceEnum基类需要返回符合Django要求的(存储值, 显示文本)元组列表。比如根据你给出的choices选项,基类可以这么写:

# choices.py
from enum import Enum

class ChoiceEnum(Enum):
    @classmethod
    def choices(cls):
        # 匹配你定义的('BIG','Larger')这种格式
        return [(member.name, member.value) for member in cls]

对应的Book模型里的嵌套枚举保持你的定义:

class Book(models.Model):
    class FontSize(ChoiceEnum):
        BIG = 'Larger'
        MID = 'Normal'
        SMALL = 'Small'
    
    # 其他字段...
    font_size = models.CharField(
        choices=FontSize.choices(),
        default=FontSize.MID,
        max_length=10
    )

4. 清理旧迁移并重新生成

如果之前已经生成了错误的迁移文件,需要先清理再重新生成:

  • 删除library/migrations/目录下除了__init__.py之外的所有文件
  • 运行python manage.py makemigrations重新生成正确的迁移文件
  • 最后运行python manage.py migrate应用迁移

这样就能解决这个AttributeError问题了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:57:38