首页 > 解决方案 > 在创建新类 Airport 并在 makemigrations 引发 IntegrityError 后迁移它时对航班进行一些更改之后

问题描述

从 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}")

错误

要执行的操作:应用所有迁移:admin、auth、contenttypes、flights、sessions 运行迁移:应用 flight.0002_auto_20201119_1418...Traceback(最近一次调用最后):文件“C:\Users\arora\Documents\Harvard\lec- 4\airline\manage.py”,第 22 行,在 main() 文件“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 utility.execute() 文件“C :\Users\arora\Documents\Harvard\lec-4\venv\lib\site-packages\django\core\ management_init_.py”,第 395 行,在执行 self.fetch_command(subcommand).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 行,迁移状态 = 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 状态 = 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 migration_recorded = True File "C:\Users\arora\Documents\Harvard\lec-4\venv\lib\site-packages\django\db\backends\sqlite3\schema.py",第 35 行, 在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(state, 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 migration_recorded = True File "C:\Users\arora\Documents\Harvard\lec-4\venv\lib\site-packages\django\db\backends\sqlite3\schema.py" ,第 35 行,在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(state, 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 migration_recorded = True File "C:\Users\arora\Documents\Harvard\lec-4\venv\lib\site-packages\django\db\backends\sqlite3\schema.py" ,第 35 行,在fake_initial=fake_initial) 文件“C:\Users\arora\Documents\Harvard\lec-4\venv\lib\site-packages\django\db\migrations\executor.py”,第 229 行,在 apply_migration migration_recorded = True File 中C:\Users\arora\Documents\Harvard\lec-4\venv\lib\site-packages\django\db\backends\sqlite3\schema.py",第 35 行,在fake_initial=fake_initial) 文件“C:\Users\arora\Documents\Harvard\lec-4\venv\lib\site-packages\django\db\migrations\executor.py”,第 229 行,在 apply_migration migration_recorded = True File 中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 raise IntegrityError( django.db.utils.IntegrityError: 表 'flights_flight' 中主键为 '1' 的行具有无效的外键:flights_flight.origin_id 包含一个值 'new york' 在 flight_airport 中没有对应的值。ID。

标签: django-models

解决方案


您需要删除之前创建的航班条目。在 shell 中使用 flight.delete()

(您还需要将代码重置为以前的原点和目的地值作为 CharFields 而不是 ForeignKeys,再次执行迁移以删除机场类,迁移更改并返回 shell,访问数据库中的航班并将其删除。 .返回并使用机场类进行更改)


推荐阅读