Django没有该列错误

2 投票
2 回答
5255 浏览
提问于 2025-04-18 15:33

我在我的models.py文件里有以下代码:

from django.db import models
from django.db.models import permalink

class Page(models.Model):
    name = models.CharField(max_length=100,db_index=True, unique=True)
    slug = models.SlugField(max_length=100,db_index=True, unique=True)

    def __unicode__(self):
        return '%s' % self.name

class Category(models.Model):
    name = models.CharField(max_length=100, db_index=True, unique=True)
    slug = models.SlugField(max_length=100, db_index=True, unique=True)

    def __unicode__(self):
        return '%s' % self.name

class Post(models.Model):
    title = models.CharField(max_length=100, unique=True, db_index=True)
    body = models.TextField()
    post_date = models.DateField(db_index = True, auto_now_add=True)
    category = models.ForeignKey('board.Category')
    page = models.ForeignKey('board.Page')

    def __unicode__(self):
        return '%s' % self.title

    @permalink
    def get_absolute_url(self):
       return "/%i/%i" % Page.slug, self.id

当我在管理页面尝试添加一个Post对象时(我也配置了admin.py),却遇到了以下错误:

没有这个列:board_category.name

我查了一下资料,尝试删除表格然后再执行syncdb,但不知怎么的,还是出现这个错误。

于是我列出了我的表格:

CREATE TABLE "board_page" (
    "id" integer NOT NULL PRIMARY KEY,
    "name" varchar(100) NOT NULL UNIQUE,
    "slug" varchar(100) NOT NULL UNIQUE
)
;
CREATE TABLE "board_category" (
    "id" integer NOT NULL PRIMARY KEY,
    "name" varchar(100) NOT NULL UNIQUE,
    "slug" varchar(100) NOT NULL UNIQUE
)
;
CREATE TABLE "board_post" (
    "id" integer NOT NULL PRIMARY KEY,
    "title" varchar(100) NOT NULL UNIQUE,
    "body" text NOT NULL,
    "post_date" date NOT NULL,
    "category_id" integer NOT NULL REFERENCES "board_category" ("id"),
    "page_id" integer NOT NULL REFERENCES "board_page" ("id")
)
;
CREATE INDEX "board_post_896eb94b" ON "board_post" ("post_date");
CREATE INDEX "board_post_6f33f001" ON "board_post" ("category_id");
CREATE INDEX "board_post_3fb9c94f" ON "board_post" ("page_id");

我并不是SQL方面的专家,但我能清楚地看到board_page.name这个列是存在的,所以我真的不知道为什么会出现这个错误。

而且最奇怪的是,添加另一个页面或类别却是可以的……

--编辑

from django.contrib import admin
from board.models import Page, Post, Category

class PageAdmin(admin.ModelAdmin):
    #fields = ['name','slug']
    pass
class PostAdmin(admin.ModelAdmin):
    #fields = ['title','body','category','page']
    pass
class CategoryAdmin(admin.ModelAdmin):
    #fields = ['name','slug']
    pass
admin.site.register(Page, PageAdmin)
admin.site.register(Post, PostAdmin)
admin.site.register(Category, CategoryAdmin)

2 个回答

2

syncdb 这个命令只会为那些还没有安装的模型创建表格。也就是说,如果你在安装后对模型类做了修改,它不会自动更新数据库中的表格。

更好的做法是使用 South 来迁移你模型的变化。

第一次迁移可以用:

python manage.py schemamigration yourapp --initial 
python manage.py migrate yourapp

后续的迁移可以用:

python manage.py schemamigration yourapp --auto
python manage.py migrate yourapp
1

如果你在模型中添加了东西,但之后没有同步,就会出现这种情况。
如果你刚开始做这个项目,我建议你删除数据库,然后重新创建它,接着:

python manage.py syncdb

否则可以使用 South。
http://south.readthedocs.org/en/latest/

这很有意思,但有时候重启服务器也能解决问题。我以前遇到过几次这样的情况,重启后就好了。

撰写回答