Django django.db.utils.IntegrityError

У нас есть таблица с тысячами строк. Теперь нам нужно сделать 1 существующее поле внешним ключом другой таблицы. Таблица 'List' содержит все имена и их детали. Таблица 'State' - это новая таблица, включенная позже и используемая для связи с существующей таблицей 'List'.

Модель приведена ниже,

class List(models.Model):
    Lid = models.AutoField(primary_key=True)
    Name = models.CharField(max_length=100)
    addr1 = models.CharField(max_length=100)
    addr2 = models.CharField(max_length=100) 
    City = models.CharField(max_length=40) 
    State = models.ForeignKey(State,blank=True, on_delete=models.DO_NOTHING, default=None,to_field="state",db_column="State") #,to_field="state",db_column="State"

Ниже приведена ошибка, возникающая при попытке миграции,

 IntegrityError(
django.db.utils.IntegrityError: The row in table 'list' with primary key '1' has an invalid foreign key: list.State contains a value '' that does not have a corresponding value in State.state.

Как решить эту проблему? Я добавил эти 'blank=True' и on_delete=models.DO_NOTHING после поиска решения в google, но все еще безрезультатно.

Если вы хотите иметь строку из List и 1 строку из State. Это может быть o2o-ключ (неважно, какая модель), или вы можете использовать Foreign-key в List. Но: DB-таблица State должна иметь в вашей db_column="State" только уникальные ключи.

Если вы хотите иметь все строки из List и некоторые строки из State. Внешний ключ должен находиться в модели State, а не в List.

После этого: При миграции необходимо преобразовать колонку list.state в value_type, как в state.state.

Например, у вас есть type(list.state) = string и type(State.state) = integer. Это может работать и без него, я знаю, но лучше проверить это при миграции. Если у вас в list.state default=None, также вы можете преобразовать every_list_row.state = '' в every_list_row.state = None, чтобы избежать проблем в будущем, при экспорте и т.д.

Если вы получаете ForeignObjectException - объект не существует на list_row.state: Вы можете создать что-то вроде этого:

@property    
def get_state(self):
        return hasattr(list_row, 'state') and list_row.state or ''

и после этого: list_row.get_state

Вернуться на верх