问题描述
我有一个 Django 模型,它具有另一个模型的外键:
I have a Django model that has a foreign key to another model:
class Example(models.Model)
something = models.ForeignKey(SomeModel, db_index=True)
我想将底层的DB列保留为字段,但要摆脱数据库中的外键约束.
I want to keep the underlying DB column as a field, but to get rid of the foreign key constraint in the database.
所以模型会变成:
class Example(models.Model):
something_id = models.IntegerField()
而且,需要明确的是,something_id
是 Django 为外键字段创建的列.
And, to be clear, something_id
is the column that Django had created for the foreign key field.
我不想删除该列并重新创建它(这是 Django 在如上所述更改模型后自动生成迁移时所做的).
I do not want to drop the column and re-create it (this is what Django does when I auto-generate migrations after changing the model as above).
我想保留字段但是我想通过迁移移除数据库中的外键约束.我不清楚如何使用 Django 迁移来做到这一点 - 是否有一些内置支持,或者我是否必须运行一些原始 SQL,如果是,我如何以编程方式获取约束的名称?
I want to keep the field but I want to remove the foreign key constraint in the database with a migration. It's not clear to me how to do this with a Django migration - is there some built in support for it or do I have to run some raw SQL and, if so, how do I programatically get the name of the constraint?
推荐答案
这是我设法做到的,它基于上面nimasmi的回答:
This is how I managed to do it, it's based on nimasmi's answer above:
class Migration(migrations.Migration):
dependencies = [
('my_app', '0001_initial'),
]
# These *WILL* impact the database!
database_operations = [
migrations.AlterField(
model_name='Example',
name='something',
field=models.ForeignKey('Something', db_constraint=False, db_index=True, null=False)
),
]
# These *WON'T* impact the database, they update Django state *ONLY*!
state_operations = [
migrations.AlterField(
model_name='Example',
name='something',
field=models.IntegerField(db_index=True, null=False)
),
migrations.RenameField(
model_name='Example',
old_name='something',
new_name='something_id'
),
]
operations = [
migrations.SeparateDatabaseAndState(
database_operations=database_operations,
state_operations=state_operations
)
]
这篇关于Django 1.9 在迁移中删除外键的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!