2015-02-23 44 views
0

这里的我的模型代码Django的迁移:可用NOT NULL约束失败

class student(models.Model): 
    name = models.CharField(max_length=100) 
    age = models.IntegerField() 
    available = models.BooleanField(default=False, blank=True) 

在上述模型是我的新领域,我现在要迁移数据库,但它给我的错误,当我运行下面的命令

python manage.py migrate 

Operations to perform: 
    Apply all migrations: student 
Running migrations: 
    Applying order.0004_auto_20150223_1758...Traceback (most recent call last): 
    File "manage.py", line 10, in <module> 
    execute_from_command_line(sys.argv) 
    File "/home/nikhil/live-devEnv/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 385, in execute_from_command_line 
    utility.execute() 
    File "/home/nikhil/live-devEnv/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 377, in execute 
    self.fetch_command(subcommand).run_from_argv(self.argv) 
    File "/home/nikhil/live-devEnv/local/lib/python2.7/site-packages/django/core/management/base.py", line 288, in run_from_argv 
    self.execute(*args, **options.__dict__) 
    File "/home/nikhil/live-devEnv/local/lib/python2.7/site-packages/django/core/management/base.py", line 338, in execute 
    output = self.handle(*args, **options) 
    File "/home/nikhil/live-devEnv/local/lib/python2.7/site-packages/django/core/management/commands/migrate.py", line 160, in handle 
    executor.migrate(targets, plan, fake=options.get("fake", False)) 
    File "/home/nikhil/live-devEnv/local/lib/python2.7/site-packages/django/db/migrations/executor.py", line 63, in migrate 
    self.apply_migration(migration, fake=fake) 
    File "/home/nikhil/live-devEnv/local/lib/python2.7/site-packages/django/db/migrations/executor.py", line 97, in apply_migration 
    migration.apply(project_state, schema_editor) 
    File "/home/nikhil/live-devEnv/local/lib/python2.7/site-packages/django/db/migrations/migration.py", line 107, in apply 
    operation.database_forwards(self.app_label, schema_editor, project_state, new_state) 
    File "/home/nikhil/live-devEnv/local/lib/python2.7/site-packages/django/db/migrations/operations/fields.py", line 37, in database_forwards 
    field, 
    File "/home/nikhil/live-devEnv/local/lib/python2.7/site-packages/django/db/backends/sqlite3/schema.py", line 167, in add_field 
    self._remake_table(model, create_fields=[field]) 
    File "/home/nikhil/live-devEnv/local/lib/python2.7/site-packages/django/db/backends/sqlite3/schema.py", line 135, in _remake_table 
    self.quote_name(model._meta.db_table), 
    File "/home/nikhil/live-devEnv/local/lib/python2.7/site-packages/django/db/backends/schema.py", line 99, in execute 
    cursor.execute(sql, params) 
    File "/home/nikhil/live-devEnv/local/lib/python2.7/site-packages/django/db/backends/utils.py", line 81, in execute 
    return super(CursorDebugWrapper, self).execute(sql, params) 
    File "/home/nikhil/live-devEnv/local/lib/python2.7/site-packages/django/db/backends/utils.py", line 65, in execute 
    return self.cursor.execute(sql, params) 
    File "/home/nikhil/live-devEnv/local/lib/python2.7/site-packages/django/db/utils.py", line 94, in __exit__ 
    six.reraise(dj_exc_type, dj_exc_value, traceback) 
    File "/home/nikhil/live-devEnv/local/lib/python2.7/site-packages/django/db/backends/utils.py", line 65, in execute 
    return self.cursor.execute(sql, params) 
    File "/home/nikhil/live-devEnv/local/lib/python2.7/site-packages/django/db/backends/sqlite3/base.py", line 485, in execute 
    return Database.Cursor.execute(self, query, params) 
django.db.utils.IntegrityError: NOT NULL constraint failed: student.available 

这里有什么不对,请给我一个解决上述问题的方法。

+0

异常与字段'order_userorder__new.isUrgent'有关。你能提供相关模型的代码吗? – 2015-02-23 09:43:57

+0

isUrgent = models.BooleanField(default = False),该新字段添加到我的用户订单字段中 – 2015-02-23 10:30:21

+0

https://code.djangoproject.com/ticket/21783 – 2015-04-10 05:03:02

回答

1

我有这个问题,当我想要将字段更改为非空值时,但数据库中已有数据,其中此值为空时会导致冲突。我能够通过

Add来解决它的可空字段。

migrations.AddField(
    model_name='mymodel', 
    name='new_field', 
    field=models.OneToOneField(to='app.OtherModel', null=True, default=None), 
    preserve_default=False, 
), 

使用RunPython来填充一些现有的数据是有意义的

migrations.RunPython(fix_null_fields) 

最后alter领域是非空

migrations.AlterField(
    model_name='mymodel', 
    name='new_field', 
    field=models.OneToOneField(to='app.OtherModel'), 
    preserve_default=True, 
), 

这个领域似乎为工作我没有任何麻烦。欲了解更多信息,请看MigrationsMigration operations

相关问题