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_columnfunción.El primer argumento de
db.rename_columnes 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 bajoprojectyitemaunque estén en camello).fuente
Esto es lo que hago:
myapp/models.py)./manage.py schemamigration myapp renaming_column_x --autoNote
renaming_column_xpuede 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.pyque 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
xocolumn_x?--automigración primero es un gran consejo. Evita problemas con el congelador South ORM, que ocurre si la migración solo tiene métodosforwardsybackwardsmétodos, pero no contiene elmodelobjeto congelado .db.rename_columnno 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_uniqueydb.create_uniquelo 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_columnno 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
makemigrationsen 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
southa 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