Me gustaría cambiar un nombre de campos específicos en un modelo:
class Foo(models.Model):
name = models.CharField()
rel = models.ForeignKey(Bar)
debería cambiar a:
class Foo(models.Model):
full_name = models.CharField()
odd_relation = models.ForeignKey(Bar)
¿Cuál es la forma más fácil de hacer esto usando South?
python
django
django-models
django-south
Jonathan
fuente
fuente
Respuestas:
Puedes usar la
db.rename_column
función.El primer argumento de
db.rename_column
es el nombre de la tabla, por lo que es importante recordar cómo Django crea los nombres de las tablas :En el caso de que tenga un nombre de modelo con múltiples camellos, como ProjectItem, el nombre de la tabla será
app_projectitem
(es decir, no se insertará un guión bajoproject
yitem
aunque estén en camello).fuente
Esto es lo que hago:
myapp/models.py
)./manage.py schemamigration myapp renaming_column_x --auto
Note
renaming_column_x
puede ser lo que quiera, es solo una forma de dar un nombre descriptivo al archivo de migración.Esto generará un archivo llamado
myapp/migrations/000x_renaming_column_x.py
que eliminará su columna anterior y agregará una nueva columna.Modifique el código en este archivo para cambiar el comportamiento de migración a un simple cambio de nombre:
fuente
x
ocolumn_x
?--auto
migración primero es un gran consejo. Evita problemas con el congelador South ORM, que ocurre si la migración solo tiene métodosforwards
ybackwards
métodos, pero no contiene elmodel
objeto congelado .db.rename_column
no cambia el nombre de las restricciones asociadas con la columna. La migración seguirá funcionando, pero tendrá restricciones con el nombre de la columna anterior. Tenía una columna con una restricción de unicidad, la renombré usando este método, probé que la restricción de unicidad aún existía y obtuve un error, pero el nombre de la restricción todavía estaba usando el nombre de la columna anterior. Quizás explícitodb.delete_unique
ydb.create_unique
lo hubiera hecho, pero decidí ir con la solución de sjh.No sabía acerca de la columna db.rename, parece útil, sin embargo, en el pasado agregué la nueva columna como un esquema de migración, luego creé una migración de datos para mover los valores al nuevo campo, luego una segunda migración de esquema para eliminar la columna anterior
fuente
db.rename_column
no cambiará el nombre de las restricciones para usted, por lo que debe manejarlo manualmente. Si olvida hacerlo, la migración funcionará, excepto que, sin que lo sepa, puede haber una restricción que todavía use el nombre de la columna anterior. No me queda claro si el problema es meramente cosmético o si en una futura migración donde la restricción debe ser manipulada o eliminada, el Sur no podrá encontrarla. En cualquier caso, hacerlo aquí como sugiere sjh es la forma segura de hacerlo: puedes dejar que South descubra lo que debería estar resolviendo.Django 1.7 introdujo Migraciones, por lo que ahora ni siquiera necesita instalar un paquete adicional para administrar sus migraciones.
Para cambiar el nombre de su modelo, primero debe crear una migración vacía:
Luego debe editar el código de su migración de esta manera:
Y después de eso necesitas correr:
fuente
Simplemente cambie el modelo y ejecute
makemigrations
en 1.9Django detecta automáticamente que ha eliminado y creado un solo campo, y le pregunta:
Diga sí y se creará la migración correcta. Magia.
fuente
south
a sus aplicaciones instaladas en el archivo de configuración del proyecto.$ manage.py Schemamigration <app_name> --initial
$ manage.py migrate <app_name> --Fake
$ manage.py Schemamigration --auto
$ manage.py migrate <app_name>
Si está usando 'pycharm', puede usar 'ctrl + shift + r' en lugar de 'manage.py' y 'shift' para los parámetros.
fuente