2012-08-28 25 views
6

Tôi đã viết một vài bài kiểm tra cho ứng dụng viết blog thực sự đơn giản, nhưng nhiều mối quan hệ thất bại khi tôi chạy thử nghiệm: ./manage.py test myblogDjango thử nghiệm: DatabaseError: không có bảng như vậy cho ManyToManyField

DatabaseError: no such table: myblog_post_tag 

Tuy nhiên, khi Tôi làm ./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; 

Tạo bảng, nhưng không thực hiện được trong khi thử nghiệm? Bất kỳ trợ giúp được đánh giá cao. Dưới đây là thử nghiệm của tôi:

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) 

Và models.py của tôi nếu cần thiết:

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 

Trả lời

1

./manage.py sql myblog không thực hiện SQL, nó chỉ xuất ra những gì nó sẽ thực hiện nếu bạn chạy syncdb.

Trong trường hợp này, có vẻ như bảng bị thiếu trong db của bạn.

Nếu điều này là kết quả của việc sửa đổi đối với ứng dụng hiện có; ví dụ bạn vừa thêm một trường mới vào mô hình của mình; sau đó chạy syncdb sẽ không ảnh hưởng đến các thay đổi đối với cơ sở dữ liệu của bạn. syncdb không thực hiện bất kỳ thao tác phá hoại nào (như thêm hoặc xóa bảng hoặc cột).

Trong trường hợp này, bạn có thể chạy truy vấn để thêm cột theo cách thủ công; hoặc thả và tạo lại các bảng của bạn với syncdb.

Vì đây là vấn đề phổ biến nên hầu hết mọi người sử dụng công cụ di chuyển dữ liệu như south để xử lý các thay đổi này cho bạn. Nam sẽ quản lý những thay đổi nhỏ này một cách thông minh.

+2

Nhưng tôi không sử dụng syncdb. Ngay bây giờ tôi chỉ chạy thử nghiệm, vì vậy khi tôi chạy thử nghiệm, liệu nó có tạo ra một cơ sở dữ liệu thử nghiệm không? – binarymac

Các vấn đề liên quan