Django1.7.1需要字段的默认值,但数据库中没有条目。为什么?

2024-05-17 06:33:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我遇到了一个奇怪的问题。我在macosxyosemite上使用django1.7.1,并配置了一个本地MySQL数据库。在

通常,我创建一个模型,如果我想添加另一个字段,我只需执行一个./manage.py migrate,Django将创建一个新的数据库列。在

我就是这么做的。这是我的模型:

from django.db import models
from django.utils.translation import ugettext as _


class Product(models.Model):
    CATEGORY_CHOICES = (
        ('apphosting', _('Application Hosting')),
        ('webhosting', _('Web Hosting'))
    )

    category = models.CharField(max_length=25, choices=CATEGORY_CHOICES)
    name = models.CharField(max_length=25)
    price_monthly = models.FloatField()

    def __unicode__(self):
        return self.name

请注意,我已经添加了字段price_monthly。然后,我做了一个./manage.py migrate

^{pr2}$

好吧,我做一个./manage.py makemigrations,结果是:

(mysphere)dmanser@ragamuffin:~/git/mysphere on master [!?]$ ./manage.py makemigrations
You are trying to add a non-nullable field 'price_monthly' to product without a default; we can't do that (the database needs something to populate existing rows).
Please select a fix:
 1) Provide a one-off default now (will be set on all existing rows)
 2) Quit, and let me add a default in models.py
Select an option:

奇怪的是,这个模型还没有进入。那么,如果数据库中没有产品,为什么需要提供默认值?在

我开始拔头发了,昨天我试了好几样东西。三个小时后,我放弃了。在


Tags: todjangofrompy模型import数据库default
3条回答

迁移系统的设计使得单个迁移可以应用于多个数据库。例如,您可以有一个开发版本、一个登台版本和一个或多个生产版本。这就是为什么进行迁移与应用迁移是截然不同的一步,而且为什么makemgirations不能只查看当前活动的数据库来查看它没有任何行。如果您尝试将迁移应用到一个?在

您的解决方案很简单:因为没有行,所以选项1(在所有现有行上设置默认值)根本不起任何作用。所以选择选项1,以及您喜欢的任何值。在

您以前已经应用过迁移,所以表已经创建了。现在添加的列不能为null,但尚未定义默认值。在

由于迁移将向现有表中添加列,因此它需要足够的数据,以便迁移不会违反架构;因此会出现提示。在

如果要删除表,然后运行迁移,则不会遇到此错误。但是,由于最初的迁移已经创建了表,所以以后的任何迁移都不能破坏它的引用完整性。在

我已经多次遇到这种情况,假设你的项目myproject中有一个名为app1的应用程序,在这种情况下,最好的做法是删除app1/迁移,然后再试一次,它应该可以正常工作

相关问题 更多 >