2010-10-21 10 views
8

Tengo un proyecto existente con modelos (usuarios y libros). Me gustaría agregar un campo ManyToMany (M2M) a los libros modelo existentes, pero el comando syncbb no lo hace.django agregando un campo/tabla ManyToMany al esquema existente, nombre_relacionado error

Detalles: Books ya tiene un campo FK que se asigna al usuario, y quiero agregar un nuevo campo M2M (lectores) que también se asigna al usuario. Como sabes, el syncdb de Django solo se preocupa por las tablas, por lo que agregar un campo normal es fácil, pero un M2M requiere una nueva tabla de unión (app_books_user), ¿no debería syncdb cmd agregar esto como cualquier otra tabla nueva? Creó mi otra mesa unida para el campo 'vendedores' del Libro.

Cuando ejecuté syncdb, inicialmente recibí un error que me ordenaba usar el argumento 'related_name' para ayudar a diferenciar las dos referencias al usuario. Yo agregué esos. Sin embargo, cuando ejecuto syncdb nuevamente, no crea la nueva tabla de unión (pero ahora está libre de errores). El nuevo campo existe cuando lo veo a través del Shell, pero no puedo usarlo b/c la tabla de unión no existe. Miré el código sql a través del cmd 'sqlall' e imprime el SQL para la nueva tabla, pero no se ejecuta.

¿Qué me estoy perdiendo? ¿Debo simplemente forzar el SQL (desde el sqlall) a través de mi navegador de base de datos? ¿Eso tendrá alguna repercusión? Código sigue:

Models.py

from django.contrib.auth.models import User 

class Seller(models.Model): 
    ... 

class Books(models.Model): 

    name=models.CharField(max_length=50) 
    author=models.ForeignKey(User, related_name='creator') 
    readers=models.ManyToManyField(User, blank=True, related_name='viewers') 
    sellers=models.ManyToManyField(Seller) 

Gracias

+0

Pude resolver esto ampliando el usuario con un perfil de usuario y manteniendo los "lectores" allí. – rich

Respuesta

6

syncdb no modifica las tablas existentes (modelos). Lo que sucede es que, aunque agregar un M2M no modifica una tabla (solo debe agregar una tabla de unión), syncdb no está creando la nueva tabla porque ve que el modelo ya está en la base de datos y se está salteando. Consulte syncdb docs

[syncdb] Crea las tablas de la base de datos para todas las aplicaciones en INSTALLED_APPS cuyas tablas aún no se han creado.

Es un poco confuso, ya que técnicamente esta tabla no se ha creado, pero el comportamiento tiene sentido "¿Se ha creado la tabla para este modelo? Sí, entonces no la sincronices".

En general, django no proporciona un mecanismo para migrar esquemas de base de datos (es decir, agregar columnas y demás). Entonces, tienes que hacer ese tipo de cosas a través de SQL sin procesar o usando una herramienta de terceros. Recomiendo visitar South.

Cuestiones relacionadas