南:当提供有效的一次性默认值时,为什么“column <colname>包含空值”错误</colname>

时间:2011-11-22 20:21:26

标签: django django-south

最初, 项目 类的模型属性 位置 的定义如下:

location = models.ForeignKey('Location', related_name='+', null=True, on_delete=models.SET_NULL)

然后重新定义为:

location = models.ForeignKey('Location', related_name='+', on_delete=models.PROTECT)

由于定义的变化,我执行了South的 schemamigration 。南回应

  

字段'Item.location'没有指定默认值,但是   不是NULL。由于你使这个字段不可为空,你必须   指定用于现有行的默认值。

我选择了'2'并提供了现有位置的PK(整数)。

但是当我运行 migrate 时,我收到以下错误:

  

django.db.utils.IntegrityError:列“location_id”包含空值

我不明白为什么在提供有效的默认位置PK时出现此错误。这真是令人难以置信。请帮忙〜谢谢。

迁移规范:

def forwards(self, orm):
    # Changing field 'Item.location'
    db.alter_column('lend_borrow_item', 'location_id', self.gf('django.db.models.fields.related.ForeignKey')(default=11, to=orm['app_name.Location']))
def backwards(self, orm):
    # Changing field 'Item.location'
    db.alter_column('lend_borrow_item', 'location_id', self.gf('django.db.models.fields.related.ForeignKey')(null=True, to=orm['app_name.Location']))

models = {
    'app_name.location': {
        'Meta': {'ordering': "['name']", 'object_name': 'Location'},
        'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
        'name': ('django.db.models.fields.CharField', [], {'max_length': '20'})
    },
    'lend_borrow.item': {
        'Meta': {'object_name': 'Item'},
        'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
        'location': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['app_name.Location']"}),
        'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
    }
}

2 个答案:

答案 0 :(得分:5)

此问题似乎是由South Defect #627

引起的

答案 1 :(得分:0)

实际上该解决方案已经发布,但您可能只想在相关迁移中添加一行。

...
class Migration(SchemaMigration):
    def forwards(self, orm):
        ...
        # Add the following line before the ``alter_column`` command
        orm['your_app.YourModel'].objects.filter(
            your_field__isnull=True).update(your_field=any_default_value)

        # This is the line that causes the exception
        db.alter_column(u'your_app.YourModel', 'your_field', self.gf('django.db.models.fields.Whatever')())
        ...
    ...