Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django IntegrityError更改外键_Python_Django_Database_Postgresql - Fatal编程技术网

Python Django IntegrityError更改外键

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对象作为外键引用之前,我已经

我有一个模型LucyGuide,它通过OneToOneField扩展了Django的用户模型:

还有一个公司模型,它有一个名为lucy_guide的字段,它是用户模型的外键:

我想把这个换成

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)