Python Django IntegrityError更改外键
我有一个模型LucyGuide,它通过OneToOneField扩展了Django的用户模型: 还有一个公司模型,它有一个名为lucy_guide的字段,它是用户模型的外键: 我想把这个换成Python Django IntegrityError更改外键,python,django,database,postgresql,Python,Django,Database,Postgresql,我有一个模型LucyGuide,它通过OneToOneField扩展了Django的用户模型: 还有一个公司模型,它有一个名为lucy_guide的字段,它是用户模型的外键: 我想把这个换成 class Company(models.Model): lucy_guide = models.ForeignKey(LucyGuide) 但是,当我实施此更改并进行迁移和运行迁移时,我遇到了IntegrityError: 这个问题类似于,;似乎在将LucyGuide对象作为外键引用之前,我已经
class Company(models.Model):
lucy_guide = models.ForeignKey(LucyGuide)
但是,当我实施此更改并进行迁移和运行迁移时,我遇到了IntegrityError:
这个问题类似于,;似乎在将LucyGuide对象作为外键引用之前,我已经创建了它们
解决这个问题的最佳方法是什么?是否需要在shell中编写一系列命令来创建这些用户
更新
从shell中看,Django似乎仍然希望ForeignKey具有相同的数字ID,尽管模型已从User更改为LucyGuide。以下是用户ID,它们也是LucyGuides:
请注意,其中包含错误中的id 461。然而,LucyGuides的ID很简单
In [17]: [guide.id for guide in LucyGuide.objects.all()]
Out[17]: [1, 2, 3, 4, 5, 6, 7, 8]
解决这个问题的方法似乎是更改LucyGuides的主键,但从这个角度看,这是一个非常复杂的过程。有更简单的方法吗?您不能简单地更改外键的目标。对于每个现有公司,您需要将lucy_guide_id从相关用户的id更改为相关lucy_guide的id。Django无法为您执行此操作 您可以分几个步骤进行迁移。首先,添加一个新的外键并创建迁移
class Company(models.Model):
lucy_guide = models.ForeignKey(User)
new_lucy_guide = models.ForeignKey(LucyGuide, blank=True, null=True)
接下来,创建一个用于填充新的向导字段
然后,可以删除lucy_guide字段,并创建迁移
class Company(models.Model):
new_lucy_guide = models.ForeignKey(LucyGuide, blank=True, null=True)
最后,您可以重命名字段并创建迁移:
class Company(models.Model):
lucy_guide = models.ForeignKey(LucyGuide, blank=True, null=True)
您不能简单地更改外键的目标。对于每个现有公司,您需要将lucy_guide_id从相关用户的id更改为相关lucy_guide的id。Django无法为您执行此操作 您可以分几个步骤进行迁移。首先,添加一个新的外键并创建迁移
class Company(models.Model):
lucy_guide = models.ForeignKey(User)
new_lucy_guide = models.ForeignKey(LucyGuide, blank=True, null=True)
接下来,创建一个用于填充新的向导字段
然后,可以删除lucy_guide字段,并创建迁移
class Company(models.Model):
new_lucy_guide = models.ForeignKey(LucyGuide, blank=True, null=True)
最后,您可以重命名字段并创建迁移:
class Company(models.Model):
lucy_guide = models.ForeignKey(LucyGuide, blank=True, null=True)
您不应该尝试更改LucyGuide表中对象的主键。相反,您希望更改Company表中的lucy\u guide\u id值,以便它们引用LucyGuide行。不幸的是,这是一个相当复杂的过程。to是关于更改主键的字段类型,例如从CharField更改为AutoField,这是一个不同的问题。您不应该尝试更改LucyGuide表中对象的主键。相反,您希望更改Company表中的lucy\u guide\u id值,以便它们引用LucyGuide行。不幸的是,这是一个相当复杂的过程。to是关于更改主键的字段类型,例如从CharField更改为AutoField,这是一个不同的问题。正如精度一样:您不能同时执行最后两个步骤。它将把新的字段视为ReleFieldfield,并将其名称更改为旧的Advfield。@ PierreMonico感谢确认。我删除了一段建议您将最后两个步骤合并到一个迁移中的内容。唯一的方法是手动编辑迁移文件。准确地说,您不能同时执行最后两个步骤。它将把新的字段视为ReleFieldfield,并将其名称更改为旧的Advfield。@ PierreMonico感谢确认。我删除了一段建议您将最后两个步骤合并到一个迁移中的内容。唯一的方法是手动编辑迁移文件。
class Company(models.Model):
lucy_guide = models.ForeignKey(LucyGuide, blank=True, null=True)