Это дополнительный вопрос к Удалить поле из стандартной модели Django .Вкратце: поле может быть динамически удалено из уже созданной модели, в данном случае это поле User.email.Таким образом, поле электронной почты будет удалено от пользователя без изменения кода для пользователя.Например, см. Приведенный ниже код.
Я могу динамически удалить поле из модели (1), но это происходит при запуске сервера и отменяется при его наличии.Поскольку syncdb не требует, чтобы сервер работал, и, как правило, кажется, игнорирует код удаления (каким-то образом), этот подход не предотвращает появление поля в базе данных (2).
Есть лиспособ удалить поле из модели (без изменения файла, в котором он находится, так как это модель Django), таким образом, что оно также не отображает его в базе данных?
Заранее спасибо!
Отметить
РЕДАКТИРОВАТЬ : у меня проблема , а не , что я удаляю текст "m = models.IntegerField()
" из файла модели и хочу удалить поле избаза данных.Проблема заключается в том, что я использую приведенный ниже код для удаления поля из модели, которая уже была объявлена в другом файле .Я не думаю, что создание миграции с South при каждом запуске syncdb - это решение (3).
Дополнительная информация:
- 1) В настоящее время, код находится в models.py, но я полагаю, Куда поместить код запуска Django? работает.
- 2) Я могу удалить его по сигналу post_syncdb с помощью пользовательского запроса, но я надеюсь, чточто-то более элегантное ... Или вообще элегантное, точнее.
- 3) Если это вообще работает, потому что, очевидно, syncdb все еще видит поле «удалено»), так что я думаю, что South будет каквсе еще как-то там.
Это код (models.py):
class A(models.Model):
m = models.IntegerField()
for i, f in enumerate(A._meta.fields):
if f.name == 'm':
del A._meta.fields[i]
break
class B(A):
n = models.IntegerField()
for i, f in enumerate(B._meta.fields):
if f.name == 'm':
del B._meta.fields[i]
break
РЕДАКТИРОВАТЬ: Я проверил (с печатью) и код удаления выполняется на syncdb.Выполняется до создания таблиц