我有一个预先存在的模型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列。
我的问题是:超出flush
和syncdb
我需要做些什么才能让数据库反映我模型的变化?
答案 0 :(得分:2)
不幸的是,看起来flush只会删除数据库中的所有数据,然后重新加载您的初始数据。它不会删除您的数据库/表并重新运行create
语句。
您可以输入数据库外壳并手动删除项目表(或整个数据库)。
python manage.py dbshell
DROP TABLE todo_item;
然后重新运行syncdb
在旁注 - 多年来我避免使用南方,只会改变桌子或丢弃桌子,并重新同步,但对于我最近的项目,我决定尝试一下。 South的学习曲线非常小,也非常强大,因为你永远不必放弃并重新同步你的桌子。
一旦你初始化南部,为了完成你想做的事,所有必要的是:
python manage.py schemamigration yourapp
python manage.py migrate yourapp
没有丢弃表,没有数据库,没有重新加载数据,每次模型更改时都没有重新创建超级用户