首页 > 解决方案 > 无法在 Django 中使用 FK 创建新表

问题描述

我正在尝试向我的 mysql 数据库添加一个新表。该表仅包含两个项目,每个项目都是一个 foreignKey(再往下)。但是,在将更改迁移到数据库时,我收到一条错误消息(进一步向下),我知道问题出在HS_CountriesforeignKey 中,因为我对其进行了测试,并且可以在该键不存在时迁移表。

我有其他表,我有一个HS_Countries外键。这就是为什么我对这个问题很困惑。的结构HS_Countries再往下,也是其他foreignKey的结构。

我不确定我必须进行哪些更改才能使迁移正常工作。

新表:

class User_Accumulated_Countries(models.Model):
    iso_code = models.ForeignKey(
        'HS_Countries', on_delete=models.CASCADE, related_name='iso_code')
    product = models.ForeignKey(
        'User_Product', on_delete=models.CASCADE, related_name='product')

控制台日志:

Operations to perform:
  Apply all migrations: main
Running migrations:
  Applying main.0113_user_accumulated_countries...Traceback (most recent call last):
  File "/Users/5knnbdwm/Python_env/lib/python3.8/site-packages/django/db/backends/utils.py", line 86, in _execute
    return self.cursor.execute(sql, params)
  File "/Users/5knnbdwm/Python_env/lib/python3.8/site-packages/django/db/backends/mysql/base.py", line 74, in execute
    return self.cursor.execute(query, args)
  File "/Users/5knnbdwm/Python_env/lib/python3.8/site-packages/MySQLdb/cursors.py", line 209, in execute
    res = self._query(query)
  File "/Users/5knnbdwm/Python_env/lib/python3.8/site-packages/MySQLdb/cursors.py", line 315, in _query
    db.query(q)
  File "/Users/5knnbdwm/Python_env/lib/python3.8/site-packages/MySQLdb/connections.py", line 239, in query
    _mysql.connection.query(self, query)
MySQLdb._exceptions.OperationalError: (3780, "Referencing column 'iso_code_id' and referenced column 'iso_code' in foreign key constraint 'main_user_accumulate_iso_code_id_65d73d54_fk_main_hs_c' are incompatible.")

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "manage.py", line 31, in <module>
    execute_from_command_line(sys.argv)
  File "/Users/5knnbdwm/Python_env/lib/python3.8/site-packages/django/core/management/__init__.py", line 401, in execute_from_command_line
    utility.execute()
  File "/Users/5knnbdwm/Python_env/lib/python3.8/site-packages/django/core/management/__init__.py", line 395, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/Users/5knnbdwm/Python_env/lib/python3.8/site-packages/django/core/management/base.py", line 328, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/Users/5knnbdwm/Python_env/lib/python3.8/site-packages/django/core/management/base.py", line 369, in execute
    output = self.handle(*args, **options)
  File "/Users/5knnbdwm/Python_env/lib/python3.8/site-packages/django/core/management/base.py", line 83, in wrapped
    res = handle_func(*args, **kwargs)
  File "/Users/5knnbdwm/Python_env/lib/python3.8/site-packages/django/core/management/commands/migrate.py", line 231, in handle
    post_migrate_state = executor.migrate(
  File "/Users/5knnbdwm/Python_env/lib/python3.8/site-packages/django/db/migrations/executor.py", line 117, in migrate
    state = self._migrate_all_forwards(state, plan, full_plan, fake=fake, fake_initial=fake_initial)
  File "/Users/5knnbdwm/Python_env/lib/python3.8/site-packages/django/db/migrations/executor.py", line 147, in _migrate_all_forwards
    state = self.apply_migration(state, migration, fake=fake, fake_initial=fake_initial)
  File "/Users/5knnbdwm/Python_env/lib/python3.8/site-packages/django/db/migrations/executor.py", line 247, in apply_migration
    migration_recorded = True
  File "/Users/5knnbdwm/Python_env/lib/python3.8/site-packages/django/db/backends/base/schema.py", line 115, in __exit__
    self.execute(sql)
  File "/Users/5knnbdwm/Python_env/lib/python3.8/site-packages/django/db/backends/base/schema.py", line 142, in execute
    cursor.execute(sql, params)
  File "/Users/5knnbdwm/Python_env/lib/python3.8/site-packages/django/db/backends/utils.py", line 100, in execute
    return super().execute(sql, params)
  File "/Users/5knnbdwm/Python_env/lib/python3.8/site-packages/django/db/backends/utils.py", line 68, in execute
    return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
  File "/Users/5knnbdwm/Python_env/lib/python3.8/site-packages/django/db/backends/utils.py", line 77, in _execute_with_wrappers
    return executor(sql, params, many, context)
  File "/Users/5knnbdwm/Python_env/lib/python3.8/site-packages/django/db/backends/utils.py", line 86, in _execute
    return self.cursor.execute(sql, params)
  File "/Users/5knnbdwm/Python_env/lib/python3.8/site-packages/django/db/utils.py", line 90, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "/Users/5knnbdwm/Python_env/lib/python3.8/site-packages/django/db/backends/utils.py", line 86, in _execute
    return self.cursor.execute(sql, params)
  File "/Users/5knnbdwm/Python_env/lib/python3.8/site-packages/django/db/backends/mysql/base.py", line 74, in execute
    return self.cursor.execute(query, args)
  File "/Users/5knnbdwm/Python_env/lib/python3.8/site-packages/MySQLdb/cursors.py", line 209, in execute
    res = self._query(query)
  File "/Users/5knnbdwm/Python_env/lib/python3.8/site-packages/MySQLdb/cursors.py", line 315, in _query
    db.query(q)
  File "/Users/5knnbdwm/Python_env/lib/python3.8/site-packages/MySQLdb/connections.py", line 239, in query
    _mysql.connection.query(self, query)
django.db.utils.OperationalError: (3780, "Referencing column 'iso_code_id' and referenced column 'iso_code' in foreign key constraint 'main_user_accumulate_iso_code_id_65d73d54_fk_main_hs_c' are incompatible.")

其他外键:

class HS_Countries(models.Model):
    iso_code = models.CharField(primary_key=True, max_length=2)
    country = models.CharField(max_length=255)
    eu = models.BooleanField(null=True)
    fta = models.BooleanField(null=True)
    # ...

class User_Product(models.Model):
    code = models.ForeignKey('HS_Code', on_delete=models.CASCADE, null=False)
    article_id_own = models.TextField()
    article_id_customer = models.TextField(null=True)
    article_name_own = models.TextField()
    article_name_customer = models.TextField(null=True)
    country_of_origin = models.ForeignKey(
        'HS_Countries', on_delete=models.CASCADE, null=False)
    accumulated = models.BooleanField(null=True)

标签: pythonmysqldjangodjango-models

解决方案


推荐阅读