2012-08-28 8 views
6

He escrito un par de pruebas de aplicación muy simple blog, pero la relación muchos a muchos fallan al ejecutar la prueba: ./manage.py test myblogDjango prueba: DatabaseError: no hay tal mesa para ManyToManyField

DatabaseError: no such table: myblog_post_tag 

Sin embargo, cuando hago ./manage.py sql myblog:

BEGIN; 
CREATE TABLE "myblog_tag" (
    "id" integer NOT NULL PRIMARY KEY, 
    "name" varchar(50) NOT NULL 
) 
; 
CREATE TABLE "myblog_post_tag" (
    "id" integer NOT NULL PRIMARY KEY, 
    "post_id" integer NOT NULL, 
    "tag_id" integer NOT NULL REFERENCES "myblog_tag" ("id"), 
    UNIQUE ("post_id", "tag_id") 
) 
; 
CREATE TABLE "myblog_post" (
    "id" integer NOT NULL PRIMARY KEY, 
    "title" varchar(200) NOT NULL, 
    "pub_date" datetime NOT NULL, 
    "content" text NOT NULL 
) 
; 
COMMIT; 

lo hace crear una tabla, sin embargo, no lo hace durante la prueba? Cualquier ayuda es apreciada. Aquí está mi prueba:

class TagModelTest(TestCase): 

    def test_create_tags_for_posts(self): 
     # tests tagging posts, postodd will have tags 1 & 3, posteven will be 2 & 4 
     postodd = Post(
      title="testing odd tags", 
      pub_date=timezone.now(), 
      content='''hello everybody, we are testing some tagging 
       functionality here. This post should have odd tags.''', 
     ) 
     posteven = Post(
      title="test even tags", 
      pub_date=timezone.now(), 
      content ='''hello everybody, we are testing some tagging 
       functionality here. This post should have even tags.''', 
     ) 
     #save them to db 
     postodd.save() 
     posteven.save() 

     # create the tags 
     tag1 = Tag(name="1") 
     tag2 = Tag(name="2") 
     tag3 = Tag(name="3") 
     tag4 = Tag(name="4") 

     # save all tags to db 
     tag1.save() 
     tag2.save() 
     tag3.save() 
     tag4.save() 

     # create the many2many relationship 
     postodd.tag.add(tag1) 

Y mi models.py si es necesario:

from django.db import models 


class Tag(models.Model): 
    name = models.CharField(max_length=50) 

    def __unicode__(self): 
     return self.name 


class Post(models.Model): 
    tag = models.ManyToManyField(Tag) 
    title = models.CharField(max_length=200) 
    pub_date = models.DateTimeField(verbose_name="Date published") 
    content = models.TextField() 

    def __unicode__(self): 
     return self.title 

Respuesta

1

./manage.py sql myblog no ejecuta el SQL, sólo se da salida a lo que sería ejecutar si se ejecutó syncdb.

En este caso, parece que la tabla no se encuentra en su base de datos.

Si esto fue el resultado de una modificación de una aplicación existente; por ejemplo, acaba de agregar un nuevo campo a su modelo; luego ejecutar syncdb no afectará los cambios en su base de datos. syncdb no hace ninguna operación destructivos (como añadir o eliminar tablas o columnas).

En este caso se puede ejecutar manualmente la consulta para agregar la columna; o suelte y vuelva a crear sus tablas con syncdb.

Dado que este es un problema común la mayoría de la gente utiliza una herramienta de migración de datos como south para manejar estos cambios para usted. South administrará estos pequeños cambios inteligentemente.

+2

Pero no estoy usando syncdb. En este momento solo estoy ejecutando pruebas, así que cuando ejecuto una prueba, ¿no crea una base de datos de prueba de todos modos? – binarymac

Cuestiones relacionadas