【发布时间】:2015-10-19 02:46:24
【问题描述】:
我正在构建一个开源可重复使用的应用程序,该应用程序的用户需要能够在settings 中的某些CharField 字段上设置自己的choices。
让 Django 忽略对 choices 字段选项的更改并且从不(应该添加该功能)实现数据库级选择选择是否可能/合理?
这不是实际的代码,而是
这将在models.py
class Owner(models.Model):
city = models.CharField(
verbose_name=u'City',
max_length=255,
blank=True,
choices=settings.CITIES,
db_index=True)
这将在settings.py
CITIES = (
('chicago', 'Chicago, IL'),
('milwaukee', 'Milwaukee, WI')
)
这将导致这种迁移
class Migration(migrations.Migration):
operations = [
migrations.CreateModel(
name='owner',
fields=[
('city', models.CharField(blank=True, max_length=3, db_index=True, choices=[(b'chicago', b'Chicago, IL'), (b'milwaukee', b'Milwaukee, WI')])),
]
现在,假设最终用户想要更改他们的应用程序,以便在他们的 settings.py 中使用它
CITIES = (
('los_angeles', 'Los Angeles, CA'),
('san_fransisco', 'San Fransisco, CA')
)
这将导致使用python manage.py makemigrations 创建另一个迁移,如下所示:
class Migration(migrations.Migration):
dependencies = [
('appname', '0001_initial'),
]
operations = [
migrations.AlterField(
model_name='user',
name='city',
field=models.CharField(blank=True, max_length=255, verbose_name='City', db_index=True, choices=[(b'los_angeles', b'Los Angeles, CA'), (b'san_fransisco', b'San Fransisco, CA')]),
),
]
即使该应用的其他用户可能拥有完全不同的受支持城市列表。
当我发布具有0002 迁移编号的新版本开源应用程序时,这可能会导致冲突,如果曾经有数据库级别的选择强制执行,这可能会造成严重破坏。
是否可以让 Django 在迁移创建期间忽略对 choices 字段的更改?扩展CharField 似乎是合理的。
或者我是否必须使用永远不会更改的ForeignKey 重构它并将select_related() 添加到经理?
【问题讨论】:
-
这是设计使然,这就是我仍然使用 South 进行迁移的原因。这是对您的问题的更好解释stackoverflow.com/questions/26152633/…
-
该死的,害怕那个。在我阅读了那个答案/那些票并添加了那个答案之后,今天中午找到了一个 hacky 方法。感谢您的提醒!
标签: python django django-models django-migrations