表 polls_choice 没有名为 poll_id 的列。

6

我正在进行Django教程的第二部分。当我在Django管理页面尝试添加“选项”时,出现了以下错误:

DatabaseError: table polls_choice has no column named poll_id

当我执行该命令时,会得到以下结果。
python manage.py sql polls

BEGIN;
CREATE TABLE "polls_poll" (
    "id" integer NOT NULL PRIMARY KEY,
    "question" varchar(200) NOT NULL,
    "pub_date" datetime NOT NULL
)
;
CREATE TABLE "polls_choice" (
    "id" integer NOT NULL PRIMARY KEY,
    "poll_id" integer NOT NULL REFERENCES "polls_poll" ("id"),
    "choice_text" varchar(200) NOT NULL,
    "votes" integer NOT NULL
)
;

COMMIT; 

这是我的settings.py文件。 http://pastebin.com/g4KvigqX 非常感谢您的帮助!谢谢!
2个回答

11

看起来你是在运行了syncdb之后才添加了投票外键。 syncdb 只会创建表,而不会对添加/修改/删除字段进行迁移。

对于Django 1.7+,应该使用迁移(migrations)代替syncdb。 对于Django < 1.7,强烈建议使用south来执行数据库迁移。

然而,由于你正在按照教程进行学习,并且没有任何重要数据,最简单的方法是删除表并重新创建它。 在数据库shell中运行以下命令:

drop table polls_choice;

再次运行syncdb以重新创建表单。

如果您的数据库中没有任何数据,删除sqlite db文件然后再次运行syncdb将更快。


不确定如何在sqlite3上删除polls_choice =/ 似乎无法在shell中显示我的表格。 - Liondancer
2
@Liondancer 你无法通过命令行访问 SQLite 数据库。最好的方法是删除数据库文件,重新创建它,然后再运行 syncdb。 - user1428660
1
@Ergusto 如果没有重要数据,删除db文件并再次运行syncdb可能是最快的方法。但是你所说的“无法通过命令行访问sqlite数据库”是什么意思?dbshell管理命令或sqlite3 <dbfile>呢? - Alasdair
1
@Alasdair 你说得对。我会编辑我的回复。编辑:不知道为什么无法编辑。这实际上让我有点沮丧。我以前也遇到过这种情况,总是只好删除文件。 - user1428660
@Alasdair 我对sqlite3还比较陌生。我尝试了https://dev59.com/QnVD5IYBdhLWcg3wHnwX上的命令,但是没有任何东西出现=/ - Liondancer
3
运行命令 python ./manage dbshell 然后输入 .tables 应该可以正常工作。 - Alasdair

5

在创建ChoicePoll的外键之前,你是否运行了python manage.py syncdb命令?你可能需要删除数据库并重新运行该命令。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接