2009-05-06 14 views
51

Tengo un pequeño sitio web con algunos usuarios y me gustaría agregar un campo a uno de mis modelos (y por lo tanto tablas). El problema es que syncdb por supuesto no Toque los modelos existentes e intento descubrir cómo agregar este campo al modelo/tabla sin tener que repoblar todo.Agregando un campo a un modelo de Django existente

Ejemplo:

class Newspaper(models.Model): 
    name = models.CharField() 

class UserProfile(models.Model): 
    user = models.ForeignKey(user, unique=True) 
    reads = models.ManyToManyField(Newspaper) 

Ahora me gustaría añadir un campo de URL (blank=True) para el modelo Newspaper sin romper los perfiles de usuario.

¿Alguna idea?

Respuesta

38

No hay una forma incorporada de hacerlo. Sin embargo, hay una serie de proyectos de terceros que lo harán por usted. Los dos líderes se llaman South y django-evolution, aunque también hay varios otros (incluido uno con el que he estado involucrado, dmigrations).

Definitivamente recomendaría South, tiene varias funciones realmente buenas y funciona muy bien.

+0

Creo que también es una buena idea sentirse cómodo alterando sus bases de datos usted mismo, especialmente cuando se trata de operaciones simples como agregar una nueva columna o restricción. Es una excelente manera de aprender los conceptos básicos de las bases de datos de relaciones, así como también sobre el ORM de Django. Y es super fácil una vez que sabes cómo. –

+4

¿podría decirnos cómo? – holmeswatson

+1

Y años más tarde, South ahora es parte del núcleo de Django. –

18

Usted podría intentar conseguir el SQL para su nuevo campo usando:

manage.py sql appname 

Dónde appname es el nombre de la aplicación en la que sus vidas clase periódico.

Luego, puede agregar manualmente un campo a su tabla appname_newspaper, usando ALTER TABLE. No conozco una forma de hacerlo directamente con Django, ya que Django no admite migraciones.

+0

Un pequeño comentario: si usted va esta ruta, recomiendo realizar la migración (rellenando los valores iniciales de la columna) en su aplicación Django , simplemente buscando valores no inicializados y haciéndolo sobre la marcha. Intentar completarlos desde una aplicación diferente corre el riesgo de tener problemas con el almacenamiento en caché. –

1

2015 respuesta:

Ejecutar el siguiente:

python manage.py makemigrations 
python manage.py migrate 
Cuestiones relacionadas