11

I have a Django model that uses the choices attribute.

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

My code is in production and now I'd like to add additional choices.

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

How do I go about doing this? Does Django use Database constraints to enforce choices? Do I need to do a Database migration (I'm using South)? Or does Django just enforce the choices restriction in Python code and all I have to do is change the code and restart?

Thanks!

Adam
  • 43,763
  • 16
  • 104
  • 144

2 Answers2

14

Django doesn't enforce choices on a database level, it only uses them for the presentation of the widgets and in validation. If you want them a bit more 'dynamic', for example to have different ones on different servers you could define them via settings.py:

from django.conf import settings

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

Then you could define different choices in your settings.py (no need for any database migration!).

Bernhard Vallant
  • 49,468
  • 20
  • 120
  • 148
2

The field is models.CharField so the database will treat it like any other models.CharField set up in django :)

No, it doesn't enforce choices / you don't need to touch your DB.

Yuji 'Tomita' Tomita
  • 115,817
  • 29
  • 282
  • 245