2012-08-28 1 views
6

ManyToManyField J'ai écrit quelques tests pour l'application blog très simple, mais plusieurs à plusieurs échoue quand je lance le test: ./manage.py test myblogtest Django: DatabaseError: pas de table pour

DatabaseError: no such table: myblog_post_tag 

Pourtant, lorsque Je fais ./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; 

il ne crée une table, mais il ne parvient pas à le faire lors des tests? Toute aide est appréciée. Voici mon test:

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) 

Et mon models.py si nécessaire:

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 

Répondre

1

./manage.py sql myblog n'exécute pas le SQL, il produit juste ce qu'il serait exécuter si vous exécutiez syncdb.

Dans ce cas, il semble que la table manque dans votre db.

S'il s'agit d'un résultat d'une modification apportée à une application existante; par exemple, vous venez d'ajouter un nouveau champ à votre modèle; puis l'exécution syncdb n'affectera pas les modifications apportées à votre base de données. syncdb ne fait aucune opération destructrice (comme ajouter ou supprimer des tables ou des colonnes).

Dans ce cas, vous pouvez exécuter manuellement la requête pour ajouter la colonne; ou laissez tomber et recréer vos tables avec syncdb. Comme il s'agit d'un problème courant, la plupart des gens utilisent un outil de migration de données comme south pour gérer ces changements pour vous. South va gérer ces petits changements intelligemment.

+2

Mais je n'utilise pas syncdb. À l'heure actuelle, je ne fais que des tests, alors quand je lance un test, ne crée-t-il pas une base de test? – binarymac

Questions connexes