最近使用Django admin在后台来添加删除一些数据,使用模型中的字段的choices来实现下拉框的功能,但是发现后期choices如果要新增或是删除就会要重新生成migrations文件,为了解决这个问题,只能设法让django的choices可以动态地生成了。
我们新建一个模型,代码如下,其中source字段配置了choices选项:
1 2 3 4 5 6 7
| from django.db import models
class Dynamics(models.Model): source = models.CharField(max_length=64, choices=( ('baidu', 'baidu'), ('google', 'google'), ))
|
在makemigrations后,可以看到migration文件里面生成的代码会是:
1 2 3 4 5 6 7 8 9
| operations = [ migrations.CreateModel( name='Dynamics', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('source', models.CharField(choices=[('baidu', 'baidu'), ('google', 'google')], max_length=64)), ], ), ]
|
很显然,后期只要在model里面修改choices,就要生成新的migration文件。
此时我们可以考虑在模型中用一个函数get_source_choices来生成choices,在定义模型的使用直接填入这个函数:
1 2 3 4 5 6 7 8 9 10 11 12
| from django.db import models
def get_source_choices(): return ( ('baidu', 'baidu'), ('google', 'google'), ('duckduckgo', 'duckduckgo'), )
class Dynamics(models.Model): source = models.CharField(max_length=64, choices=get_source_choices())
|
然后修改下刚才生成的migration文件,把这个函数引入到migration文件中,并修改source字段的配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| from django.db import migrations, models from ..models import get_source_choices
class Migration(migrations.Migration):
initial = True
dependencies = [ ]
operations = [ migrations.CreateModel( name='Dynamics', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('source', models.CharField(choices=get_source_choices(), max_length=64)), ], ), ]
|
此后,对choices的修改就直接修改get_source_choices函数就可以了,无论怎么修改都不会再生成新的migration文件了。