6

我已经为非常简单的博客应用程序编写了几个测试,但是当我运行测试时,多对多关系失败了:./manage.py test myblog

DatabaseError: no such table: myblog_post_tag

然而,当我这样做时./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;

它确实创建了一个表,但在测试时却没有这样做?任何帮助表示赞赏。这是我的测试:

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
4

1 回答 1

1

./manage.py sql myblog不执行 SQL,它只是输出如果你运行它syncdb执行的内容。

在这种情况下,您的数据库中似乎缺少该表。

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

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

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

于 2012-08-28T06:50:51.497 回答