在创建新类 Airport 并在 makemigrations 引发 IntegrityError 后迁移它时对航班进行一些更改之后
Posted
技术标签:
【中文标题】在创建新类 Airport 并在 makemigrations 引发 IntegrityError 后迁移它时对航班进行一些更改之后【英文标题】:After creating a new class Airport and make some changes in flights when i migrate it after makemigrations throws IntegrityError 【发布时间】:2021-03-02 15:05:39 【问题描述】:从 django.db 导入模型
在这里创建您的模型。
class Airport(models.Model):
code = models.CharField(max_length=3)
city = models.CharField(max_length=64)
def __str__(self):
return f"self.city, (self.code)"
class Flight(models.Model):
origin = models.ForeignKey(Airport, on_delete= models.CASCADE, related_name="departures" )
destination = models.ForeignKey(Airport, on_delete=models.CASCADE, related_name="arrivals")
duration = models.IntegerField()
def __str__(self):
return (f"self.origin To self.destination")
错误
在运行命令 python manage.py migrate 时,它显示 IntegrityError。要执行的操作: 应用所有迁移:admin、auth、contenttypes、flights、sessions 运行迁移: 正在应用 flight.0002_auto_20201119_1418...Traceback(最近一次通话最后一次): 文件“C:\Users\arora\Documents\Harvard\lec-4\airline\manage.py”,第 22 行,在 主要的() 文件“C:\Users\arora\Documents\Harvard\lec-4\airline\manage.py”,第 18 行,在 main execute_from_command_line(sys.argv) 文件“C:\Users\arora\Documents\Harvard\lec-4\venv\lib\site-packages\django\core\management_init_.py”,第 401 行,在 execute_from_command_line 实用程序.execute() 文件“C:\Users\arora\Documents\Harvard\lec-4\venv\lib\site-packages\django\core\management_init_.py”,第 395 行,在执行中 self.fetch_command(子命令).run_from_argv(self.argv) 文件“C:\Users\arora\Documents\Harvard\lec-4\venv\lib\site-packages\django\core\management\base.py”,第 330 行,在 run_from_argv self.execute(*args, **cmd_options) 文件“C:\Users\arora\Documents\Harvard\lec-4\venv\lib\site-packages\django\core\management\base.py”,第 371 行,执行 输出 = self.handle(*args, **options) 文件“C:\Users\arora\Documents\Harvard\lec-4\venv\lib\site-packages\django\core\management\base.py”,第 85 行,已包装 res = handle_func(*args, **kwargs) 文件“C:\Users\arora\Documents\Harvard\lec-4\venv\lib\site-packages\django\core\management\commands\migrate.py”,第 243 行,在句柄中 post_migrate_state = executor.migrate( 迁移中的文件“C:\Users\arora\Documents\Harvard\lec-4\venv\lib\site-packages\django\db\migrations\executor.py”,第 117 行 state = self._migrate_all_forwards(state, plan, full_plan, fake=fake, fake_initial=fake_initial) 文件“C:\Users\arora\Documents\Harvard\lec-4\venv\lib\site-packages\django\db\migrations\executor.py”,第 147 行,在 _migrate_all_forwards state = self.apply_migration(状态,迁移,fake=fake,fake_initial=fake_initial) 文件“C:\Users\arora\Documents\Harvard\lec-4\venv\lib\site-packages\django\db\migrations\executor.py”,第 229 行,在 apply_migration 迁移记录=真 exit 中的文件“C:\Users\arora\Documents\Harvard\lec-4\venv\lib\site-packages\django\db\backends\sqlite3\schema.py”,第 35 行 self.connection.check_constraints() 文件“C:\Users\arora\Documents\Harvard\lec-4\venv\lib\site-packages\django\db\backends\sqlite3\base.py”,第 343 行,在 check_constraints 提高完整性错误( django.db.utils.IntegrityError:表“flights_flight”中主键为“1”的行具有无效的外键:flights_flight.origin_id 包含一个值“new york”,但在 flight_airport.id 中没有对应的值。
【问题讨论】:
【参考方案1】:您需要删除之前创建的航班条目。 在 shell 中使用 flight.delete()
(您还需要将代码重置为以前的起点和目的地值作为 CharFields 而不是 ForeignKeys,再次执行迁移以删除机场类,迁移更改并返回 shell,访问数据库中的航班并删除它..返回并使用机场类进行更改)
【讨论】:
以上是关于在创建新类 Airport 并在 makemigrations 引发 IntegrityError 后迁移它时对航班进行一些更改之后的主要内容,如果未能解决你的问题,请参考以下文章
Django Migration (makemigrations) 应该与创建模型分开提交吗?