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 に答える