无法使用Django中的FK创建新表

2024-09-28 16:20:57 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我还有其他表,其中有一个HS_Countries外键。这就是为什么我对这个问题感到困惑的原因。HS_Countries的结构进一步向下,另一个外键的结构也向下

我不确定我必须改变什么才能让迁移正常进行

新表格:

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)

Tags: djangoinpyselfenvexecutedbmodels