Я создаю приложение для многократного использования с открытым исходным кодом, которое требует от пользователей приложения возможности устанавливать свои собственные choices
на некоторые поля CharField
в settings
.Игнорировать изменения в CharField «выборы» во время создания миграции Django
Возможно ли разумное изменение параметров 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()
к менеджеру?
Для справки, here's the Django makemigrations
inspector code
Это по дизайну, поэтому я все еще использую Юг для выполнения моих миграций. Вот лучшее объяснение вашего вопроса http://stackoverflow.com/questions/26152633/why-does-django-1-7-creates-migrations-for-changes-in-field-choices –
Черт, боялся этого. Нашел хакерский способ сделать это в середине дня сегодня после того, как я прочитал этот ответ/эти билеты и добавил этот ответ. Спасибо за головы! – NickCatal