簡體   English   中英

Django 將現有字段更改為外鍵

[英]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 ,因為我需要可靠地跨開發、生產和我的同事計算機工作。

您可以進行數據遷移

  1. 添加新字段
  2. 進行數據遷移https://docs.djangoproject.com/en/3.1/topics/migrations/#data-migrations
  3. 刪除舊字段

我不確定,可能還有另一種解決方案,您可以將字段重命名為您想要的名稱,然后將字段更改為新類型(進行遷移)

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
            ),
    ]

我今天也遇到了同樣的問題。 無需重命名現有字段或刪除現有列即可完成。

  1. 使用 CreateModel 操作更新初始遷移
...
        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",
                    ),
                ),
  1. 檢查Car model 的Car.manufacturer字段上的db_constraintdb_index是否為True 如果未設置字段,則 True 是默認值。
  2. 運行./manage.py makemigrations生成AlterField遷移,並在Car.manufacturer_id上具有所需的約束和索引。

第一步不會影響 db 一致性,因為生成的 DDL 對於IntegerFieldForeignKey將是相同的,其中db_constaint=Falsedb_index=False並且第二次遷移添加了缺少的約束和索引。

您可以使用./manage.py sqlmigrate app migration命令進行檢查

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM