2010-10-21 106 views
8

我有一個包含模型(用戶和書籍)的現有項目。我想將ManyToMany(M2M)字段添加到現有的模型書籍中,但syncbb命令不會執行此操作。django將ManyToMany字段/表添加到現有模式,related_name錯誤

詳情:書籍已經有一個映射到用戶的FK字段,並且我想添加一個也映射到用戶的新M2M字段(讀者)。如你所知,Django的syncdb只關心表,所以添加一個普通字段很容易,但M2M需要一個新的連接表(app_books_user),所以不應該將syncdb cmd添加到其他任何新表中?它爲本書的「賣家」字段創建了我的另一張連接表。

當我運行syncdb時,我最初收到一個錯誤,指示我使用'related_name'參數來幫助區分兩個用戶引用。我添加了這些。但是,當我再次運行syncdb時,它不會創建新的連接表(但它現在沒有錯誤)。當我通過Shell查看它時存在新字段,但不能使用它連接表不存在。我通過'sqlall'cmd查看了SQL代碼,它打印出新表的SQL,但沒有執行。

我錯過了什麼?我應該通過我的數據庫瀏覽器強制SQL(來自sqlall)嗎?這會有什麼影響嗎?代碼如下:

Models.py

from django.contrib.auth.models import User 

class Seller(models.Model): 
    ... 

class Books(models.Model): 

    name=models.CharField(max_length=50) 
    author=models.ForeignKey(User, related_name='creator') 
    readers=models.ManyToManyField(User, blank=True, related_name='viewers') 
    sellers=models.ManyToManyField(Seller) 

謝謝

+0

我可以通過擴展用戶UserProfile和保留'讀者'在那裏解決這個問題。 – rich 2010-10-21 18:29:33

回答

6

執行syncdb不修改現有的表(型號)。發生的是,即使添加一個M2M不修改表(它應該只是添加一個連接表),syncdb不會創建新表,因爲它看到該模型已經在數據庫中,並且正在跳過它。請參閱syncdb docs

[syncdb]爲INSTALLED_APPS中尚未創建表的所有應用程序創建數據庫表。

這是一個有點混亂,因爲在技術上此表還沒有被創建,但行爲很有道理「已經創造了這個模型的桌子嗎?是的!那麼不同步的。」

通常,django不提供遷移數據庫模式的機制(即添加列等)。所以,你必須通過原始SQL或使用第三方工具來完成這樣的事情。我強烈建議檢查South