Перед syncdb удалите поле из стандартной модели Django - PullRequest
1 голос
/ 11 декабря 2011

Это дополнительный вопрос к Удалить поле из стандартной модели 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.Выполняется до создания таблиц

1 Ответ

0 голосов
/ 11 декабря 2011

django делает много мета-классов, и я думаю, что мета-класс отвечает за определение таблицы базы данных для поддержки вашей модели.Впоследствии простого удаления поля недостаточно для изменения сгенерированной таблицы.

Как указали несколько человек, юг - это способ решения этих проблем.

...