Django makemigrations工作,迁移失败,使用" django.db.utils.IntegrityError:NOT NULL约束失败"

时间:2014-08-03 21:02:52

标签: python django sqlite

我被困住了。 Django 1.7,SQLite3。

我已更改模型以添加thumbnail列,如this tutorial中所示。就是这样:

from django.db import models

class Article(models.Model):
    title = models.CharField(max_length=200)
    body = models.TextField()
    pub_date = models.DateTimeField('date published')
    likes = models.IntegerField(default=0)

    def __str__(self):
        return  self.title

现在是这样的:

from django.db import models
from time import time         

def get_upload_file_name(instance, filename):
    return  "uploaded_files/%s_%s" % (str(time()).replace(".", "_"), filename)

class Article(models.Model):
    title = models.CharField(max_length=200)
    body = models.TextField()
    pub_date = models.DateTimeField('date published')
    likes = models.IntegerField(default=0) 
    thumbnail = models.FileField(upload_to=get_upload_file_name, null=True)

    def __str__(self):
        return  self.title

我使用

将所有数据备份到json文本文件
python manage.py dumpdata article --indent=4 > article.json

然后执行

python manage.py makemigrations

哪个有效。但是

python manage.py migrate

失败

django.db.utils.IntegrityError: NOT NULL constraint failed: article_article__new.thumbnail

现在,即使将null=True添加到thumbnail中的models.py行,运行makemigrations也会成功,而migrate也会失败。

我该怎么办?

2 个答案:

答案 0 :(得分:14)

我的应用名称(使用python manage.py startapp创建)称为articles。在多次获得空约束错误后,这是新的articles\migrations文件夹:

__init__.py
0001_initial.py
0002_auto_20140803_1540.py
0003_auto_20140803_1542.py
0004_auto_20140803_1450.py
0005_auto_20140803_1552.py
__pycache__
   __init__.cpython-34.pyc
   0001_initial.cpython-34.pyc
   0002_auto_20140803_1540.cpython-34.pyc
   0003_auto_20140803_1542.cpython-34.pyc
   0004_auto_20140803_1450.cpython-34.pyc
   0005_auto_20140803_1552.cpython-34.pyc

我删除了除0001之外的所有000 *文件。

然后我跑了

python manage.py makemigrations

python manage.py migrate

成功。

谢天谢地irc.freenode.net/django

答案 1 :(得分:0)

只需添加另一个解决方案。

就我而言,我如何创建BASE_DIR是不正确的,因此DATABASES NAME也是错误的。因此,它正在其他地方创建数据库。当我运行迁移时,它可能是抛出该错误的原因,因为那里存在一些旧数据库。因此,解决方法是只更正DATABASE路径。