you tag register forget did django django-south

tag - django no hay tal tabla:



did you forget to register or load this tag (6)

Tengo modelos en Django configurados de la siguiente manera.

class Pupil(models.Model): forename = models.CharField(max_length=30) surname = models.CharField(max_length=30) dateofbirth = models.DateField() year = models.IntegerField() class_group = models.CharField(max_length=30) email = models.EmailField(blank=True) assignments = models.ManyToManyField(''Assignment'', verbose_name=''related assignments'') def __unicode__(self): return u''%s %s'' % (self.forename, self.surname) class Subject(models.Model): name = models.CharField(max_length=30) level = models.CharField(max_length=30) teachers = models.ManyToManyField(''Teacher'', verbose_name=''related teachers'') def __unicode__(self): return self.name class Teacher(models.Model): forename = models.CharField(max_length=30) surname = models.CharField(max_length=30) email = models.EmailField(blank=True) def __unicode__(self): return u''%s %s'' % (self.forename, self.surname) class Assignment(models.Model): assignment_name = models.CharField(max_length=30) date_assigned = models.DateField() date_submitted = models.DateField() def __unicode__(self): return self.assignment_name

Cuando intento agregar un alumno y adjuntar una asignación al alumno en el administrador, aparece un error en la base de datos:

no such table: homework_pupil_assignments

después de leer this me di cuenta de que esto podría deberse a que Django no actualizaba los cambios a mis modelos como cuando hago la manage.py sqlall homework

Veo lo siguiente:

BEGIN; CREATE TABLE "homework_pupil_assignments" ( "id" integer NOT NULL PRIMARY KEY, "pupil_id" integer NOT NULL, "assignment_id" integer NOT NULL, UNIQUE ("pupil_id", "assignment_id") ) ; CREATE TABLE "homework_pupil" ( "id" integer NOT NULL PRIMARY KEY, "forename" varchar(30) NOT NULL, "surname" varchar(30) NOT NULL, "dateofbirth" date NOT NULL, "year" integer NOT NULL, "class_group" varchar(30) NOT NULL, "email" varchar(75) NOT NULL ) ; CREATE TABLE "homework_subject_teachers" ( "id" integer NOT NULL PRIMARY KEY, "subject_id" integer NOT NULL, "teacher_id" integer NOT NULL, UNIQUE ("subject_id", "teacher_id") ) ; CREATE TABLE "homework_subject" ( "id" integer NOT NULL PRIMARY KEY, "name" varchar(30) NOT NULL, "level" varchar(30) NOT NULL ) ; CREATE TABLE "homework_teacher" ( "id" integer NOT NULL PRIMARY KEY, "forename" varchar(30) NOT NULL, "surname" varchar(30) NOT NULL, "email" varchar(75) NOT NULL ) ; CREATE TABLE "homework_assignment" ( "id" integer NOT NULL PRIMARY KEY, "assignment_name" varchar(30) NOT NULL, "date_assigned" date NOT NULL, "date_submitted" date NOT NULL ) ; COMMIT;

Luego instalé South, siguiendo las instrucciones para comenzar a trabajar con una aplicación existente, con la esperanza de sincronizar con éxito estas tablas. Sin alegría.

¿Alguien puede sugerir cómo puedo obtener la base de datos (sqlite3) para reflejar los modelos o señalar qué estoy haciendo mal?


Respuesta actualizada para migraciones Django sin complemento south :

Como T.T sugirió en su answer , mi respuesta anterior fue para el complemento de migración al south , cuando Django no tiene ninguna característica de migración de esquema. Ahora (funciona en Django 1.9+):

T.T answer :

¡Puedes probar esto!

python manage.py migrate --run-syncdb

Outdated para el plugin de migraciones del south

Como puedo ver, lo hizo todo en el orden incorrecto, para arreglarlo debe completar esta lista de verificación (supongo que no puede eliminar el archivo de base de datos sqlite3 para comenzar de nuevo):

  1. Coge cualquier herramienta GUI de SQLite (es decir, http://sqliteadmin.orbmu2k.de/ )
  2. Cambie la definición de su modelo para que coincida con la definición de la base de datos (el mejor enfoque es comentar nuevos campos)
  3. Eliminar carpeta de migrations en su modelo
  4. Elimine las filas en la tabla south_migrationhistory donde app_name coincide con el nombre de su aplicación (probablemente homework )
  5. Invoque: ./manage.py schemamigration <app_name> --initial
  6. Cree tablas mediante ./manage.py migrate <app_name> --fake ( --fake omitirá la ejecución de SQL porque la tabla ya existe en su base de datos)
  7. Realiza cambios en el modelo de tu aplicación.
  8. Invoque ./manage.py schemamigration <app_name> --auto
  9. Luego aplique los cambios a la base de datos: ./manage.py migrate <app_name>

Los pasos 7,8,9 se repiten cada vez que su modelo necesita algún cambio.


¡Puedes probar esto!

python manage.py migrate --run-syncdb

Tengo el mismo problema con Django 1.9 y 1.10. ¡Este código funciona!


Si está utilizando la última versión de django 1.11.x, primero debe crear migraciones,

python manage.py makemigrations

Después de eso solo tienes que ejecutar el comando migrate para sincronizar la base de datos.

python manage.py migrate --run-syncdb

Estos sincronizarán la base de datos y los modelos de Python y, además, el segundo comando imprimirá todos los sql que están detrás.


Una forma de sincronizar su base de datos con sus modelos de django es eliminar su archivo de base de datos y ejecutar makemigrations y migrar los comandos nuevamente. Esto reflejará su estructura de modelos django en su base de datos desde cero. Sin embargo, asegúrese de hacer una copia de seguridad de su archivo de base de datos antes de eliminarlos en caso de que necesite sus registros.

Esta solución funcionó para mí, ya que no me molestaban mucho los datos y solo quería que mi estructura de db y modelos se sincronizara.


creo que tal vez puedas intentarlo

python manage.py syncdb

incluso sqlite3 necesita syncdb

Sencillamente, puedes verificar el nombre de tu archivo SQL

debería ser como xxx.s3db


sqlall simplemente imprime el SQL, no lo ejecuta. syncdb creará tablas que aún no se han creado, pero no modificará las tablas existentes.