我正在做这个教程tangowithdjango 5 Models and databases
在练习中,它要求创建视图并喜欢类别中默认值为0的列。然后使用填充脚本使用值更新它们。 直接引用网站
更新类别模型以包含其他属性视图 并喜欢默认值为零的地方。
所以我已经去了并在models.py中创建了类别
from django.db import models
from django.template.defaultfilters import default
# Create your models here.
class Category(models.Model):
name = models.CharField(max_length=128, unique=True)
views = models.IntegerField(default=0)
likes = models.IntegerField(default=0)
class Meta:
verbose_name_plural = "Categories"
def __unicode__(self):
return self.name
class Page(models.Model):
category = models.ForeignKey(Category)
title = models.CharField(max_length=128)
url = models.URLField()
views = models.IntegerField(default=0)
然后我sync.db 但是列没有创建我从视图中收到此错误。
Exception Type: DatabaseError at /admin/rango/category/
Exception Value: no such column: rango_category.views
我如何创建它们有什么问题?我是否必须删除所有数据库表并重新创建它们?
修改:Incorrect Duplicate的解决方案无法解决问题,以及我认为的答案。删除数据库并重新同步并不能解决创建填充脚本的问题。
sql似乎没问题我不确定是什么问题。
BEGIN;
CREATE TABLE "rango_category" (
"id" integer NOT NULL PRIMARY KEY,
"name" varchar(128) NOT NULL UNIQUE,
"views" integer NOT NULL,
"likes" integer NOT NULL
)
;
CREATE TABLE "rango_page" (
"id" integer NOT NULL PRIMARY KEY,
"category_id" integer NOT NULL REFERENCES "rango_category" ("id"),
"title" varchar(128) NOT NULL,
"url" varchar(200) NOT NULL,
"views" integer NOT NULL
)
;
COMMIT;
Finished "/home/sayth/workspace/tango_project/manage.py sql rango" execution.
即使重新删除数据库,重新设计和重新创建模型也没有得到解决。
BEGIN;
CREATE TABLE "rango_category" (
"id" integer NOT NULL PRIMARY KEY,
"name" varchar(128) NOT NULL UNIQUE
)
;
CREATE TABLE "rango_page" (
"id" integer NOT NULL PRIMARY KEY,
"category_id" integer NOT NULL REFERENCES "rango_category" ("id"),
"title" varchar(128) NOT NULL,
"url" varchar(200) NOT NULL,
"views" integer NOT NULL,
"likes" integer NOT NULL
)
;
COMMIT;
Finished "/home/sayth/workspace/tango_project/manage.py sql rango" execution.
答案 0 :(得分:1)
啊,是的,我忽略了文件中的警告。
警告每当您添加到现有数据库模型时,您都必须这样做 删除数据库文件,然后通过运行重新同步数据库 再次python manage.py syncb。这是Django 1.5.4的缺点,而且 可能会非常令人沮丧。但是,如果您添加新模型,则可以 syncdb您的数据库,而不必删除并重新创建它。您 因此,在调整数据库时必须记住这一点:new 模型将与syncdb同步 - 但更改为现有 模特不会。向应用程序添加新模型时 models.py文件,您只需运行以下命令即可 使用命令$ python manage.py syncdb同步数据库。 将现有模型更新到应用程序的models.py文件时, 您必须执行以下步骤。删除数据库。重新创建 使用命令$ python manage.py syncdb的数据库。填充 带数据的新数据库。从中删除并重新创建数据库 划痕是一个令人沮丧的过程。这个问题的可能解决方案 可能是使用像South这样的第三方应用程序来处理 数据库架构迁移(对模型的更改)。南是 目前正在积极开发中,被认为是标准解决方案 对于Django架构迁移,直到此功能成为其中的一部分 标准的Django代码库。我们不在这里覆盖南方 - 但是 官方的南方文档提供了一个方便的教程,如果你是 感兴趣。如果您不想使用South,我们将讨论一种技术 第5.8节加快更新过程。你可能也有 注意到我们的分类模型目前缺少一些领域 我们在Rango的要求中定义。我们稍后会添加这些 提醒您更新过程。
直到django 1.7,似乎核心的迁移才会出现。
我错误地更新了应该看起来的填充脚本。
def add_page(cat, title, url, views=0):
p = Page.objects.get_or_create(category=cat, title=title, url=url, views=views)[0]
return p
def add_cat(name, views=0, likes=0):
c = Category.objects.get_or_create(name=name, views=views, likes=likes)[0]
return c
见