Django django.db.utils.IntegrityError



型号:

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:表"list"中主键为"1"的行具有无效的外键:list。State包含的值"在State.State.中没有相应的值

如何解决此问题?在谷歌上搜索解决方案后,我确实添加了"blank=True"和on_delete=models.DO_NOTHING,但仍然没有成功。

如果您希望从List中有一行,从State中有一列。它可以是o2o密钥(不管是哪种型号),也可以在List中使用外键。但是:DB表状态在db_column="State"中应该只有唯一的键。

如果您想拥有列表中的每一行和状态中的某些行。外键应该在State模型中,而不是在List中。

之后:在迁移时,您应该像state.state.中那样将列list.state转换为value_type

例如,您的类型(list.state)=字符串,类型(state.sstate)=整数。我知道,没有它也可以工作,但最好在迁移时检查一下。如果您在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