[英]Django change an existing field to foreign key
我曾經有一個像這樣的 model:
class Car(models.Model):
manufacturer_id = models.IntegerField()
id
字段指的是另一個 model Manufacturer
。 但是,我意識到使用 django 的內置外鍵功能會很有用,所以我將 model 更改為:
class Car(models.Model):
manufacturer = models.ForeignKey(Manufacturer)
這實際上立即工作正常,查詢工作沒有錯誤,一切都很好,除了如果我嘗試運行遷移,Django 輸出以下內容:
- Remove field manufacturer_id from car
- Add field manufacturer to car
進行此遷移會清除數據庫中所有現有的關系,所以我不想這樣做。 我根本不想要任何遷移,因為像Car.objects.get(manufacturer__name="Toyota")
這樣的查詢可以正常工作。 我想要一個適當的數據庫外鍵約束,但這不是一個高優先級。
所以我的問題是:有沒有辦法進行遷移或其他允許我將現有字段轉換為外鍵的方法? 我不能使用--fake
,因為我需要可靠地跨開發、生產和我的同事計算機工作。
您可以進行數據遷移
我不確定,可能還有另一種解決方案,您可以將字段重命名為您想要的名稱,然后將字段更改為新類型(進行遷移)
operations = [
migrations.RenameField(
model_name='car',
old_name='manufacturer_id',
new_name='manufacturer',
),
migrations.AlterField(
model_name='car',
name='manufacturer',
field=ForeignKey(blank=True, null=True,
on_delete=django.db.models.deletion.CASCADE
),
]
我今天也遇到了同樣的問題。 無需重命名現有字段或刪除現有列即可完成。
...
migrations.CreateModel(
name="Car",
fields=[
(
"manufacturer",
models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.DO_NOTHING,
db_constraint=False,
db_index=False,
to="Manufacturer",
),
),
Car
model 的Car.manufacturer
字段上的db_constraint
和db_index
是否為True
。 如果未設置字段,則 True 是默認值。./manage.py makemigrations
生成AlterField
遷移,並在Car.manufacturer_id
上具有所需的約束和索引。 第一步不會影響 db 一致性,因為生成的 DDL 對於IntegerField
和ForeignKey
將是相同的,其中db_constaint=False
和db_index=False
並且第二次遷移添加了缺少的約束和索引。
您可以使用./manage.py sqlmigrate app migration
命令進行檢查
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.