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