Django 固定裝置簡化了範例資料的加載,但硬編碼外鍵 ID 會造成脆弱性。 當 ID 變更或資料在資料庫之間移動時,此方法就會失效。 解決方案是什麼? 自然鍵。 它們允許您使用有意義的值而不是數字 ID 來引用外鍵。
裝置中的硬編碼主鍵會導致幾個問題:
自然鍵透過允許 Django 動態解析關係來消除這些問題。
使用自然鍵涉及以下步驟:
natural_key()
方法: 在相關模型中,加入 natural_key()
方法。 在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 來引用。
使用自然鍵來引用外鍵,而不是數字 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
尋找類別。
使用以下方式裝入夾具:
<code class="language-bash">python manage.py loaddata your_fixture.json</code>
Django 使用 get_by_natural_key()
來匹配外鍵。
不。 即使定義了 natural_key()
,您仍然可以使用:
根據需要組合它們。
何時使用自然鍵?
在下列情況下使用自然鍵:
在下列情況下使用數字 ID:
結論
Django 裝置中的自然鍵增強了資料靈活性和可管理性。 Django 不依賴可能變化的 ID,而是動態解析關係,從而產生更強大的固定裝置。 將自然鍵合併到您的 Django 專案中,以簡化裝置管理並減少問題。
以上是在沒有硬編碼 ID 的情況下使用帶有外鍵的 Django Fixture的詳細內容。更多資訊請關注PHP中文網其他相關文章!