2011-09-16 58 views
0

我是一個初學者穿過一個Django引導裝模作樣的和它告訴我把這個在models.py:如何使用Django模型創建連接表?

class Bookmark(models.Model): 
    title = models.CharField(max_length=200) 
    user = models.ForeignKey(User) 
    link = models.ForeignKey(Link) 

class Tag(models.Model): 
    name = models.CharField(max_length=64, unique=True) 
    bookmarks = models.ManyToManyField(Bookmark) 

這應該使一個連接表與此SQL:

CREATE TABLE "bookmarks_tag_bookmarks" (
    "id" integer NOT NULL PRIMARY KEY, 
    "tag_id" integer NOT NULL REFERENCES "bookmarks_tag" ("id"), 
    "bookmark_id" integer NOT NULL REFERENCES "bookmarks_bookmark" ("id"), 
    UNIQUE ("tag_id", "bookmark_id") 
); 

但是,當我運行manage.py sql書籤,而是得到這個SQL:

CREATE TABLE "bookmarks_tag_bookmarks" (
    "id" integer NOT NULL PRIMARY KEY, 
    "tag_id" integer NOT NULL, 
    "bookmark_id" integer NOT NULL REFERENCES "bookmarks_bookmark" ("id"), 
    UNIQUE ("tag_id", "bookmark_id") 
); 

連接表不引用標記表。任何人都可以請向我解釋什麼是錯的?

回答

1

進一步查看./manage.py sql的輸出。我懷疑你會看到一條線,如:

ALTER TABLE "bookmarks_tag_bookmarks" ADD CONSTRAINT "tag_id_refs_id_somehash" FOREIGN KEY ("tag_id") REFERENCES "bookmarks_bookmark" ("id") DEFERRABLE INITIALLY DEFERRED; 
+0

嗯,我沒有得到任何這樣的東西。我發佈的SQL是唯一提到了bookmarks_tag_bookmarks表的東西。 – pennydrops

+0

你應該,我從來沒有見過它做任何錯誤的事情。它非常好,可能處於最低點或更低點。這是操作順序,標記表需要存在,SQL生成器已在兩個表之前創建了連接表,因此它稍後添加了約束。你應該可以通過運行syncdb完成確認,然後進入db並檢查模式 – John

+0

哦,這非常合理。 SQL輸出顯示連接表是在標記表之前創建的。所以數據庫可能是正確的,但它向我顯示的SQL輸出是誤導性的? – pennydrops