Юг: почему ошибка «столбец <colname>содержит нулевые значения», если задано правильное одноразовое значение по умолчанию - PullRequest
4 голосов
/ 23 ноября 2011

Первоначально атрибут модели местоположение для Элемент был определен следующим образом:

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

Затем оно было переопределено на:

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

Из-за изменения в определении я выполнил schemamigration * Юга .Юг ответил

В поле «Item.location» не указано значение по умолчанию, но оно НЕ равно NULL.Поскольку вы делаете это поле необнуляемым, вы ДОЛЖНЫ указать значение по умолчанию, которое будет использоваться для существующих строк.

Я выбрал вариант '2' и предоставил PK (целое число) существующего Местоположение .

Но когда я запустил migrate , я получил следующую ошибку:

django.db.utils.IntegrityError: column "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 ]

5 голосов
/ 23 ноября 2011

Эта проблема, по-видимому, вызвана Южным дефектом # 627

0 голосов
/ 01 июня 2015

На самом деле решение уже опубликовано, но вы можете просто добавить строку в соответствующую миграцию.

...
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')())
        ...
    ...
...