Django子模型继承时如何修改或追加父模型字段的choices选项
Django继承模型修改父类choices字段方案
完全可以在子模型中修改或追加父模型字段的choices配置,你当前的场景下有两种常用实现方案:
方案1:重写字段(推荐,适配PolymorphicModel多表继承逻辑)
直接在子模型中扩展父类的CHOICES常量,并重写对应字段,修改会同步到数据库迁移规则中,逻辑更清晰:
from app1.models import ModelA class ModelB(ModelA): choice3 = "choice3" # 继承父类原有选项后追加新选项 CHOICES = ModelA.CHOICES + ( (choice3, "Choice 3"), ) # 重写字段,使用扩展后的CHOICES method = models.CharField(max_length=30, choices=CHOICES)
方案2:动态修改choices(适合不需要修改数据库结构的场景)
如果不想新增数据库字段、或者使用单表继承模式,可以在实例初始化时动态修改字段的可选选项:
from app1.models import ModelA class ModelB(ModelA): choice3 = "choice3" def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) # 运行时扩展当前实例的method字段选项 self._meta.get_field('method').choices = ModelA.CHOICES + ( (self.choice3, "Choice 3"), )
注意事项
- 追加选项时需保证新选项的存储值和父模型已有选项不重复,避免业务逻辑冲突
- 选择方案1时需要执行
makemigrations和migrate生成数据库迁移 - 选择方案2时仅对当前子模型的实例生效,不会影响父模型和其他继承自ModelA的子模型
内容的提问来源于stack exchange,提问作者kaiser
相关产品推荐
相关产品推荐

