Django如何让db反映模型的变化

时间:2014-02-09 23:20:13

标签: python django sqlite django-models

我有一个预先存在的模型Item。我最近在这个模型中添加了一个ForeignKey(User),现在当我尝试渲染页面时,我得到了no such column: todo_item.user_id

型号:

class Item(models.Model):
    user = models.ForeignKey(User) # new
    name = models.CharField(max_length=60)
    created = models.DateTimeField(auto_now_add=True)
    priority = models.IntegerField(default=0)
    difficulty = models.IntegerField(default=0)
    done = models.BooleanField(default=False)

来自manage.py sqlall的输出:

BEGIN;                                                                                                                                                               
CREATE TABLE "todo_item" (                                                                                                                                           
    "id" integer NOT NULL PRIMARY KEY,                                                                                                                               
    "user_id" integer NOT NULL REFERENCES "auth_user" ("id"),                                                                                                        
    "name" varchar(60) NOT NULL,                                                                                                                                     
    "created" datetime NOT NULL,                                                                                                                                     
    "priority" integer NOT NULL,                                                                                                                                     
    "difficulty" integer NOT NULL,                                                                                                                                   
    "done" bool NOT NULL                                                                                                                                             
)                                                                                                                                                                    
;                                                                                                                                                                    
CREATE INDEX "todo_item_6340c63c" ON "todo_item" ("user_id");                                                                                                        

COMMIT;  

我意识到manage.py syncdb不会改变我之前存在的表格。我知道我可以使用South或类似的东西来避免丢失我的数据,但我仍然处于测试模式,我不关心我表中的任何当前数据。我把它擦干净就可以了。事实上我已经有了。

我跑了:

python manage.py flush todo

然后

python manage.py syncdb

这似乎应该有效。在我运行flush后,让我输入一个新的管理员用户,并且我的所有todo_item数据都消失了。但它似乎没有杀死todo_item表。运行这些命令后,如果我在sqlite shell中使用PRAGMA table_info(todo_item),我没有看到列出的user_id列。

我的问题是:超出flushsyncdb我需要做些什么才能让数据库反映我模型的变化?

1 个答案:

答案 0 :(得分:2)

不幸的是,看起来flush只会删除数据库中的所有数据,然后重新加载您的初始数据。它不会删除您的数据库/表并重新运行create语句。

您可以输入数据库外壳并手动删除项目表(或整个数据库)。

python manage.py dbshell
DROP TABLE todo_item;

然后重新运行syncdb


在旁注 - 多年来我避免使用南方,只会改变桌子或丢弃桌子,并重新同步,但对于我最近的项目,我决定尝试一下。 South的学习曲线非常小,也非常强大,因为你永远不必放弃并重新同步你的桌子。

一旦你初始化南部,为了完成你想做的事,所有必要的是:

python manage.py schemamigration yourapp
python manage.py migrate yourapp

没有丢弃表,没有数据库,没有重新加载数据,每次模型更改时都没有重新创建超级用户