2012-08-28 37 views
6

我已经写了几个测试进行非常简单的博客应用,但是多对多的关系失败我做./manage.py sql myblogDjango的测试:DatabaseError:当我运行测试没有这样的表ManyToManyField

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; 

它确实创建了一个表,但它在测试时却失败了吗?任何帮助表示赞赏。 这里是我的测试:

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) 

我的models.py如果需要的话:

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 

回答

1

./manage.py sql myblog不执行的SQL,它只是输出什么执行,如果你跑syncdb

在这种情况下,这似乎表是从你的数据库丢失。

如果这是一个修改对现有应用的结果;例如,您只需在模型中添加一个新字段;那么运行syncdb不会影响对数据库的更改。 syncdb不会执行任何破坏性操作(如添加或删除表或列)。

在这种情况下,您可以手动运行查询,添加列;或者使用syncdb删除并重新创建表格。

由于这是一个常见的问题大多数人使用像south数据迁移工具来处理这些更改的。 South将智能地管理这些小变化。

+2

但我不会使用执行syncdb。现在我只运行测试,所以当我运行一个测试时,它是不是创建了一个测试数据库呢? – binarymac

相关问题