如何在Django模型中更改选项?

11

我有一个Django模型,使用了choices 属性

COLOR_CHOICES = (
    ('R', 'Red'),
    ('B', 'Blue'),
)
class Toy(models.Model):
    color = models.CharField(max_length=1, choices=COLOR_CHOICES)

我的代码已经在生产中了,现在我想添加额外的选项。

COLOR_CHOICES = (
        ('R', 'Red'),
        ('B', 'Blue'),
        ('G', 'Green'),
 )

我该如何做?Django是否使用数据库约束来强制选择?我需要进行数据库迁移吗(我正在使用South)?还是Django仅在Python代码中强制执行选择限制,我只需要更改代码并重新启动即可?

谢谢!

2个回答

14

Django在数据库级别上不会强制执行选项,它只在小部件的呈现和验证中使用它们。如果您想使它们更加“动态”,例如在不同的服务器上有不同的选项,您可以通过settings.py定义它们:

from django.conf import settings

COLOR_CHOICES = getattr(settings, 'COLOR_CHOICES',(
        ('R', 'Red'),
        ('B', 'Blue'),
        ('G', 'Green'),
 ))

那么您可以在settings.py中定义不同的选项(无需进行任何数据库迁移!)。


那是个很棒的想法。但你的意思是现在不需要进行数据库迁移,我只需要改代码然后重启吗? - Adam
是的...而且尝试一下不应该是什么大问题,对吧? - Bernhard Vallant
有点晚了...如果我想把所有的“红色”改成“绿色”怎么办? - Ferguzz
3
@Ferguzz MyModel.objects.filter(color="R").update(color="G") - Bernhard Vallant

2

这个字段是models.CharField类型的,因此数据库会像处理django中其他models.CharField一样来处理它 :)

不,它不会强制选择/您不需要触及您的数据库。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接