0%

Django动态生成Choices

最近使用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文件了。

如果我的文字帮到了您,那么可不可以请我喝罐可乐?