Django - 创建类别视图不会创建列

时间:2014-02-12 10:34:51

标签: python django django-models

我正在做这个教程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.

1 个答案:

答案 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

https://stackoverflow.com/a/19759473/461887

django migrations