makemigrations - Antes de syncdb, elimine el campo del modelo Django estándar
fixtures django (1)
django hace mucha magia metaclase y supongo que la metaclase es responsable de definir la tabla de la base de datos para respaldar tu modelo. Posteriormente, simplemente eliminar el campo no es suficiente para alterar la tabla generada.
como varias personas han señalado, el sur es la forma de enfrentar estos problemas.
Esta es una pregunta de seguimiento sobre el campo Eliminar del modelo estándar de Django . En resumen: un campo puede eliminarse dinámicamente de un modelo que ya está creado, en este caso el campo Usuario.email. Por lo tanto, el correo electrónico de campo se eliminará del usuario sin cambiar el código de usuario. Vea el código a continuación, por ejemplo.
Puedo eliminar dinámicamente un campo de un modelo (1), pero eso ocurre cuando el servidor se inicia y se deshace cuando existe. Como syncdb no requiere que el servidor se esté ejecutando, y generalmente parece ignorar el código de eliminación (de alguna manera), este enfoque no evita que el campo aparezca en la base de datos (2).
¿Hay alguna forma de eliminar el campo del modelo (sin cambiar el archivo en el que está, ya que es un modelo de Django), de una manera que también hace que no aparezca en la base de datos?
¡Gracias por adelantado!
marca
EDITAR : El problema no es que estoy borrando el texto " m = models.IntegerField()
" del archivo de modelo y quiero que el campo se elimine de la base de datos. El problema es que estoy usando el código siguiente para eliminar un campo de un modelo que ya ha sido declarado en otro archivo . No creo que crear una migración con South cada vez que ejecuto syncdb sea una solución (3).
Información Adicional:
- 1) Actualmente, el código está en models.py, pero supongo ¿Dónde poner el código de inicio de Django? trabajos.
- 2) Puedo eliminarlo en la señal post_syncdb con una consulta personalizada, pero espero algo más elegante ... O elegante en absoluto, con mayor precisión.
- 3) Si incluso funciona en absoluto, porque obviamente syncdb sigue viendo el campo ''eliminado''), así que creo que South lo hará ya que todavía está de alguna manera allí.
Este es el código (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
EDITAR: Marqué (con impresión) y el código de eliminación se ejecuta en syncdb. Se ejecuta antes de que se creen las tablas