Django - DatabaseError:没有这样的表

时间:2012-04-09 18:16:09

标签: python database django django-models

我定义了两个模型:

class Server(models.Model):
    owners = models.ManyToManyField('Person')

class Person(models.Model):
    name = models.CharField(max_length=50)

admin.site.register(Server)
admin.site.register(Person)

之后我甚至检查了sql,只是为了好玩:

BEGIN;
CREATE TABLE "servers_server_owners" (
    "id" integer NOT NULL PRIMARY KEY,
    "server_id" integer NOT NULL,
    "person_id" integer NOT NULL,
    UNIQUE ("server_id", "person_id")
)
;
CREATE TABLE "servers_server" (
    "id" integer NOT NULL PRIMARY KEY,
    "name" varchar(50) NOT NULL,
    "port" integer unsigned NOT NULL,
    "state" integer NOT NULL
)
;
CREATE TABLE "servers_person" (
    "id" integer NOT NULL PRIMARY KEY,
    "name" varchar(50) NOT NULL
)
;
COMMIT;

它甚至说CREATE TABLE "servers_server_owners"

我运行syncdb将新模型安装到数据库中。我去管理界面定义了一些要玩的对象,但是我收到了以下错误:

DatabaseError at /admin/servers/server/1/  
no such table: servers_server_owners

我关闭dev服务器,再次运行syncdb,启动服务器:仍然是同样的问题。为什么它不能找到,即使它只是告诉我它创建了id?

5 个答案:

答案 0 :(得分:9)

作为未来的提示,请查看South,这是一个非常有用的实用程序,用于将模型更改应用于数据库,而无需在每次更改模型时创建新数据库。 / p>

有了它,您可以轻松地:python manage.py migrate app_name和South将编写您的模型更改。 documentation非常简单。

答案 1 :(得分:7)

实际上问题是该表从未创建过。由于我是django的新手,我不知道./manage.py syncdb不会更新现有模型,而只会创建不存在的模型。

因为模型'Server'在我添加其他模型之前就存在了,并且它已经在db中,'syncdb'实际上并没有创建新表。

答案 2 :(得分:4)

我今天遇到同样的问题并修复它。 我想你在教程1中错过了一些命令。 只需遵循:

./python manage.py makemigrations polls
python manage.py sql polls
./python manage.py syncdb

然后修复它并获得表轮询,您可以看到创建的表。 你应该阅读manage.py makemigrations命令。

答案 3 :(得分:1)

对于django 1.9,这就是我所做的,它解决了这个问题。

  
    

python manage.py makemigrations app_name

         

python manage.py migrate

  

答案 4 :(得分:0)

  1. 使用“manage.py help”检查命令
  2. 如果您发现迁移和makemigration,则表示您的python已更新
  3. 第1步:

    python manage.py makemigration
    

    结果1:

    Migrations for 'mainsite':
    mainsite\migrations\0001_initial.py
    - Create model Post
    

    第2步:

    python manage.py migrate
    

    结果2:

    Operations to perform:
    Apply all migrations: admin, auth, contenttypes, mainsite, sessions
    Running migrations:
    Applying mainsite.0001_initial... OK
    

    最后,runserver。完成