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
的完整性,并且不会造成任何问题。那就批准答案吧