首頁 > 後端開發 > Python教學 > 在沒有硬編碼 ID 的情況下使用帶有外鍵的 Django Fixture

在沒有硬編碼 ID 的情況下使用帶有外鍵的 Django Fixture

DDD
發布: 2025-01-17 08:11:38
原創
338 人瀏覽過

Using Django Fixtures with Foreign Keys Without Hardcoded IDs

Django 固定裝置簡化了範例資料的加載,但硬編碼外鍵 ID 會造成脆弱性。 當 ID 變更或資料在資料庫之間移動時,此方法就會失效。 解決方案是什麼? 自然鍵。 它們允許您使用有意義的值而不是數字 ID 來引用外鍵。


為什麼要避免在裝置中使用硬編碼的外鍵 ID?

裝置中的硬編碼主鍵會導致幾個問題:

  • 不同環境的資料庫不一致。
  • 由於 ID 變更而導致的修復失敗。
  • 管理關係方面的手動工作量增加。

自然鍵透過允許 Django 動態解析關係來消除這些問題。


在 Django 實現自然鍵

使用自然鍵涉及以下步驟:

  1. 定義 natural_key() 方法: 在相關模型中,加入 natural_key() 方法。
  2. 建立自訂管理器:此管理器將使用自然鍵來取得物件。
  3. 在裝置中使用自然鍵:用自然鍵取代數字 ID。

第 1 步:在相關模型中定義自然鍵

models.py中,向外鍵引用的模型加入natural_key()方法:

<code class="language-python">from django.db import models

class CategoryManager(models.Manager):
    def get_by_natural_key(self, name):
        return self.get(name=name)

class Category(models.Model):
    name = models.CharField(max_length=255, unique=True)

    objects = CategoryManager()

    def natural_key(self):
        return (self.name,)</code>
登入後複製

這允許透過 name 引用類別,而不是在燈具中透過 ID 來引用。


第 2 步:使用自然鍵建立燈具

使用自然鍵來引用外鍵,而不是數字 ID。

夾具範例(數字 ID – 過時的方法)

<code class="language-json">[
    {
        "model": "shop.category",
        "pk": 1,
        "fields": {
            "name": "Electronics"
        }
    },
    {
        "model": "shop.product",
        "fields": {
            "name": "Smartphone",
            "category": 1
        }
    }
]</code>
登入後複製

夾具範例(自然鍵 - 改良方法)

<code class="language-json">[
    {
        "model": "shop.category",
        "fields": {
            "name": "Electronics"
        }
    },
    {
        "model": "shop.product",
        "fields": {
            "name": "Smartphone",
            "category": ["Electronics"]
        }
    }
]</code>
登入後複製

Django 自動透過 name 尋找類別。


第 3 步:裝入燈具

使用以下方式裝入夾具:

<code class="language-bash">python manage.py loaddata your_fixture.json</code>
登入後複製

Django 使用 get_by_natural_key() 來匹配外鍵。


自然鍵總是必要的嗎?

不。 即使定義了 natural_key(),您仍然可以使用:

  • 數位 ID(傳統方法)。
  • 自然鍵(適應性更強)。

根據需要組合它們。


何時使用自然鍵?

在下列情況下使用自然鍵:

  • 需要跨資料庫裝置相容性。
  • 您的模型中存在一個獨特的欄位(例如,使用者名稱、slug、名稱)。
  • 應避免手動 ID 追蹤。

在下列情況下使用數字 ID:

  • 模型中不存在唯一的自然識別碼。
  • 使用小型、不變的資料集。

結論

Django 裝置中的自然鍵增強了資料靈活性和可管理性。 Django 不依賴可能變化的 ID,而是動態解析關係,從而產生更強大的固定裝置。 將自然鍵合併到您的 Django 專案中,以簡化裝置管理並減少問題。

以上是在沒有硬編碼 ID 的情況下使用帶有外鍵的 Django Fixture的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板