2012-08-28 13 views
6

Pisałem kilka testów dla bardzo prostego bloga aplikacji, ale wiele do wielu relacji nie po uruchomieniu testu: ./manage.py test myblogDjango testowania: Databaseerror: nie taki stół do ManyToManyField

DatabaseError: no such table: myblog_post_tag 

Jednak kiedy robię ./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; 

czyni utworzyć tabelę, ale nie udaje mu się to zrobić podczas badania? Każda pomoc jest doceniana. Oto moja próba:

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) 

A mój models.py razie potrzeby:

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 

Odpowiedz

1

./manage.py sql myblog nie wykonuje SQL, to po prostu wysyła co byłoby wykonać jeśli prowadził syncdb.

W tym przypadku wydaje się, że w twojej bazie danych brakuje tabeli.

Jeśli było to wynikiem modyfikacji istniejącej aplikacji; na przykład właśnie dodałeś nowe pole do swojego modelu; następnie uruchomienie syncdb nie wpłynie na zmiany w bazie danych. syncdb nie wykonuje żadnych operacji destrukcyjnych (takich jak dodawanie lub upuszczanie tabel lub kolumn).

W tym przypadku można ręcznie uruchomić zapytanie, aby dodać kolumnę; lub upuść i ponownie utwórz swoje stoły za pomocą syncdb.

Ponieważ jest to powszechny problem, większość ludzi używa narzędzia do migracji danych, takiego jak south, aby obsłużyć te zmiany. Południe będzie inteligentnie zarządzać tymi małymi zmianami.

+2

Ale nie używam syncdb. Obecnie przeprowadzam testy, więc kiedy przeprowadzę test, czy nie utworzy to testowej bazy danych? – binarymac

Powiązane problemy