Python 我更改了模型的主键,现在它是';s'ForeignKey'模型没有';行不通

Python 我更改了模型的主键,现在它是';s'ForeignKey'模型没有';行不通,python,django,migration,Python,Django,Migration,我有一个Post模型: class Post(models.Model): id = models.CharField(max_length=18, primary_key=True, default=random_string) has_upvoted = models.ManyToManyField(User, related_name="has_upvoted") has_downvoted = models.ManyToManyField(User, relate

我有一个
Post
模型:

class Post(models.Model):
    id = models.CharField(max_length=18, primary_key=True, default=random_string)
    has_upvoted = models.ManyToManyField(User, related_name="has_upvoted")
    has_downvoted = models.ManyToManyField(User, related_name="has_downvoted")
PostScore
模型:

class PostScore(models.Model):
    user = models.ForeignKey(User, blank=True, null=True)
    post = models.ForeignKey(Post, related_name='score')
由于我最近将我的
Post
模型上的
id
从默认的
id=models.AutoField(primary\u key=True)
更改为当前的
CharField
,因此在运行
migrate
时会导致此错误:

django.db.utils.ProgrammingError: foreign key constraint "post_post_has_downvoted_post_id_3b2ec618_fk_post_post_id" cannot be implemented
DETAIL:  Key columns "post_id" and "id" are of incompatible types: integer and character varying.
你知道我该怎么解决这个问题吗

编辑:

我现在得到了这个
IntegrityError
-我不知道为什么,因为我已经删除了所有与
id
更改相关的迁移历史,所以它应该会恢复正常

以下是回溯:

Traceback (most recent call last):
  File "manage.py", line 22, in <module>
    execute_from_command_line(sys.argv)
  File "/Users/zorgan/Desktop/app/lib/python3.5/site-packages/django/core/management/__init__.py", line 364, in execute_from_command_line
    utility.execute()
  File "/Users/zorgan/Desktop/app/lib/python3.5/site-packages/django/core/management/__init__.py", line 356, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/Users/zorgan/Desktop/app/lib/python3.5/site-packages/django/core/management/base.py", line 283, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/Users/zorgan/Desktop/app/lib/python3.5/site-packages/django/core/management/base.py", line 330, in execute
    output = self.handle(*args, **options)
  File "/Users/zorgan/Desktop/app/lib/python3.5/site-packages/django/core/management/commands/migrate.py", line 204, in handle
    fake_initial=fake_initial,
  File "/Users/zorgan/Desktop/app/lib/python3.5/site-packages/django/db/migrations/executor.py", line 115, in migrate
    state = self._migrate_all_forwards(state, plan, full_plan, fake=fake, fake_initial=fake_initial)
  File "/Users/zorgan/Desktop/app/lib/python3.5/site-packages/django/db/migrations/executor.py", line 145, in _migrate_all_forwards
    state = self.apply_migration(state, migration, fake=fake, fake_initial=fake_initial)
  File "/Users/zorgan/Desktop/app/lib/python3.5/site-packages/django/db/migrations/executor.py", line 244, in apply_migration
    state = migration.apply(state, schema_editor)
  File "/Users/zorgan/Desktop/app/lib/python3.5/site-packages/django/db/migrations/migration.py", line 129, in apply
    operation.database_forwards(self.app_label, schema_editor, old_state, project_state)
  File "/Users/zorgan/Desktop/app/lib/python3.5/site-packages/django/db/migrations/operations/fields.py", line 156, in database_forwards
    schema_editor.remove_field(from_model, from_model._meta.get_field(self.name))
  File "/Users/zorgan/Desktop/app/lib/python3.5/site-packages/django/db/backends/sqlite3/schema.py", line 256, in remove_field
    self._remake_table(model, delete_field=field)
  File "/Users/zorgan/Desktop/app/lib/python3.5/site-packages/django/db/backends/sqlite3/schema.py", line 206, in _remake_table
    self.quote_name(model._meta.db_table),
  File "/Users/zorgan/Desktop/app/lib/python3.5/site-packages/django/db/backends/base/schema.py", line 120, in execute
    cursor.execute(sql, params)
  File "/Users/zorgan/Desktop/app/lib/python3.5/site-packages/django/db/backends/utils.py", line 79, in execute
    return super(CursorDebugWrapper, self).execute(sql, params)
  File "/Users/zorgan/Desktop/app/lib/python3.5/site-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
  File "/Users/zorgan/Desktop/app/lib/python3.5/site-packages/django/db/utils.py", line 94, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "/Users/zorgan/Desktop/app/lib/python3.5/site-packages/django/utils/six.py", line 685, in reraise
    raise value.with_traceback(tb)
  File "/Users/zorgan/Desktop/app/lib/python3.5/site-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
  File "/Users/zorgan/Desktop/app/lib/python3.5/site-packages/django/db/backends/sqlite3/base.py", line 328, in execute
    return Database.Cursor.execute(self, query, params)
django.db.utils.IntegrityError: datatype mismatch
回溯(最近一次呼叫最后一次):
文件“manage.py”,第22行,在
从命令行(sys.argv)执行命令
文件“/Users/zorgan/Desktop/app/lib/python3.5/site packages/django/core/management/_init__.py”,第364行,从命令行执行
utility.execute()
文件“/Users/zorgan/Desktop/app/lib/python3.5/site packages/django/core/management/__init__.py”,执行中第356行
self.fetch_命令(子命令)。从_argv(self.argv)运行_
文件“/Users/zorgan/Desktop/app/lib/python3.5/site-packages/django/core/management/base.py”,第283行,运行时从
self.execute(*args,**cmd_选项)
文件“/Users/zorgan/Desktop/app/lib/python3.5/site packages/django/core/management/base.py”,第330行,在execute中
输出=self.handle(*args,**选项)
handle中的文件“/Users/zorgan/Desktop/app/lib/python3.5/site packages/django/core/management/commands/migrate.py”,第204行
假首字母=假首字母,
文件“/Users/zorgan/Desktop/app/lib/python3.5/site packages/django/db/migrations/executor.py”,第115行,在migrate中
状态=self.\u迁移\u所有\u转发(状态,计划,完整计划,假=假,假首字母=假首字母)
文件“/Users/zorgan/Desktop/app/lib/python3.5/site packages/django/db/migrations/executor.py”,第145行,全部向前迁移
state=self.apply\u迁移(state,migration,false=false,false\u initial=false\u initial)
文件“/Users/zorgan/Desktop/app/lib/python3.5/site packages/django/db/migrations/executor.py”,第244行,应用程序迁移
state=migration.apply(状态,模式编辑器)
文件“/Users/zorgan/Desktop/app/lib/python3.5/site packages/django/db/migrations/migration.py”,第129行,在apply中
操作。数据库转发(self.app\u标签、模式编辑器、旧状态、项目状态)
数据库中的文件“/Users/zorgan/Desktop/app/lib/python3.5/site packages/django/db/migrations/operations/fields.py”,第156行
schema_editor.remove_字段(从_模型、从_模型._meta.get_字段(self.name))
文件“/Users/zorgan/Desktop/app/lib/python3.5/site packages/django/db/backends/sqlite3/schema.py”,第256行,在remove_字段中
self.\u重新制作\u表(模型,删除\u字段=字段)
文件“/Users/zorgan/Desktop/app/lib/python3.5/site packages/django/db/backends/sqlite3/schema.py”,第206行,在“重新制作”表中
self.quote_name(model._meta.db_表),
文件“/Users/zorgan/Desktop/app/lib/python3.5/site packages/django/db/backends/base/schema.py”,第120行,在execute中
cursor.execute(sql,params)
文件“/Users/zorgan/Desktop/app/lib/python3.5/site packages/django/db/backends/utils.py”,执行中第79行
返回super(CursorDebugWrapper,self).execute(sql,params)
文件“/Users/zorgan/Desktop/app/lib/python3.5/site packages/django/db/backends/utils.py”,执行中的第64行
返回self.cursor.execute(sql,params)
文件“/Users/zorgan/Desktop/app/lib/python3.5/site packages/django/db/utils.py”,第94行,在退出时__
6.重新播放(dj_exc_类型、dj_exc_值、回溯)
文件“/Users/zorgan/Desktop/app/lib/python3.5/site-packages/django/utils/six.py”,第685行,在reraise中
通过_回溯(tb)提升值
文件“/Users/zorgan/Desktop/app/lib/python3.5/site packages/django/db/backends/utils.py”,执行中的第64行
返回self.cursor.execute(sql,params)
文件“/Users/zorgan/Desktop/app/lib/python3.5/site packages/django/db/backends/sqlite3/base.py”,第328行,在execute中
返回Database.Cursor.execute(self、query、params)
django.db.utils.IntegrityError:数据类型不匹配

问题是,当您将PK类型从
AutoField
编辑到
CharField
时,它尝试从旧值获取新类型,但失败了。如果要使用UUID,请尝试改用
UUIDField

老实说,您应该触摸id参数。如果您需要将唯一字符串与数据库记录相关联,我建议您向其添加新字段

local_id = models.CharField(unique=True, mac_length=120)

如果您仍然需要字符串作为主键,即使不建议使用,最简单的方法是删除数据库,这样它就不需要将
integer
转换为
varchar

,那么您是说如果我想创建自定义主键字段,我不应该将其称为
id
?我声明您应该使用默认主键。如果您仍然需要使用,我已经更新了答案。删除数据库并从Scratch中创建它。那么您是说只有在启动新数据库时才能将PK更改为CharField吗?我将接受您的建议,并使用
local\u id
来识别唯一的字母数字字符串-以保持
id
的完整性,并且不会造成任何问题。那就批准答案吧