Django 固定裝置簡化了範例資料的加載,但硬編碼外鍵 ID 會造成脆弱性。 當 ID 變更或資料在資料庫之間移動時,此方法就會失效。 解決方案是什麼? 自然鍵。 它們允許您使用有意義的值而不是數字 ID 來引用外鍵。
為什麼要避免在裝置中使用硬編碼的外鍵 ID?
裝置中的硬編碼主鍵會導致幾個問題:
- 不同環境的資料庫不一致。
- 由於 ID 變更而導致的修復失敗。
- 管理關係方面的手動工作量增加。
自然鍵透過允許 Django 動態解析關係來消除這些問題。
在 Django 實現自然鍵
使用自然鍵涉及以下步驟:
-
定義
natural_key()
方法: 在相關模型中,加入natural_key()
方法。 - 建立自訂管理器:此管理器將使用自然鍵來取得物件。
- 在裝置中使用自然鍵:用自然鍵取代數字 ID。
第 1 步:在相關模型中定義自然鍵
在models.py
中,向外鍵引用的模型加入natural_key()
方法:
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,)
這允許透過 name
引用類別,而不是在燈具中透過 ID 來引用。
第 2 步:使用自然鍵建立燈具
使用自然鍵來引用外鍵,而不是數字 ID。
夾具範例(數字 ID – 過時的方法)
[ { "model": "shop.category", "pk": 1, "fields": { "name": "Electronics" } }, { "model": "shop.product", "fields": { "name": "Smartphone", "category": 1 } } ]
夾具範例(自然鍵 - 改良方法)
[ { "model": "shop.category", "fields": { "name": "Electronics" } }, { "model": "shop.product", "fields": { "name": "Smartphone", "category": ["Electronics"] } } ]
Django 自動透過 name
尋找類別。
第 3 步:裝入燈具
使用以下方式裝入夾具:
python manage.py loaddata your_fixture.json
Django 使用 get_by_natural_key()
來匹配外鍵。
自然鍵總是必要的嗎?
不。 即使定義了 natural_key()
,您仍然可以使用:
- 數位 ID(傳統方法)。
- 自然鍵(適應性更強)。
根據需要組合它們。
何時使用自然鍵?
在下列情況下使用自然鍵:
- 需要跨資料庫裝置相容性。
- 您的模型中存在一個獨特的欄位(例如,使用者名稱、slug、名稱)。
- 應避免手動 ID 追蹤。
在下列情況下使用數字 ID:
- 模型中不存在唯一的自然識別碼。
- 使用小型、不變的資料集。
結論
Django 裝置中的自然鍵增強了資料靈活性和可管理性。 Django 不依賴可能變化的 ID,而是動態解析關係,從而產生更強大的固定裝置。 將自然鍵合併到您的 Django 專案中,以簡化裝置管理並減少問題。
以上是在沒有硬編碼 ID 的情況下使用帶有外鍵的 Django Fixture的詳細內容。更多資訊請關注PHP中文網其他相關文章!

pythonuseshybridapprace,ComminingCompilationTobyTecoDeAndInterpretation.1)codeiscompiledtoplatform-Indepententbybytecode.2)bytecodeisisterpretedbybythepbybythepythonvirtualmachine,增強效率和通用性。

theKeyDifferencesBetnewpython's“ for”和“ for”和“ loopsare:1)” for“ loopsareIdealForiteringSequenceSquencesSorkNowniterations,而2)”,而“ loopsareBetterforConterContinuingUntilacTientInditionIntionismetismetistismetistwithOutpredefinedInedIterations.un

在Python中,可以通過多種方法連接列表並管理重複元素:1)使用 運算符或extend()方法可以保留所有重複元素;2)轉換為集合再轉回列表可以去除所有重複元素,但會丟失原有順序;3)使用循環或列表推導式結合集合可以去除重複元素並保持原有順序。

fasteStmethodMethodMethodConcatenationInpythondependersonListsize:1)forsmalllists,operatorseffited.2)forlargerlists,list.extend.extend()orlistComprechensionfaster,withextendEffaster,withExtendEffers,withextend()withextend()是extextend()asmoremory-ememory-emmoremory-emmoremory-emmodifyinginglistsin-place-place-place。

toInSerteLementIntoApythonList,useAppend()toaddtotheend,insert()foreSpificPosition,andextend()formultiplelements.1)useappend()foraddingsingleitemstotheend.2)useAddingsingLeitemStotheend.2)useeapecificindex,toadapecificindex,toadaSpecificIndex,toadaSpecificIndex,blyit'ssssssslorist.3 toaddextext.3

pythonlistsareimplementedasdynamicarrays,notlinkedlists.1)他們areStoredIncoNtiguulMemoryBlocks,mayrequireRealLealLocationWhenAppendingItems,EmpactingPerformance.2)LinkesedlistSwoldOfferefeRefeRefeRefeRefficeInsertions/DeletionsButslowerIndexeDexedAccess,Lestpypytypypytypypytypy

pythonoffersFourmainMethodStoreMoveElement Fromalist:1)刪除(值)emovesthefirstoccurrenceofavalue,2)pop(index)emovesanderturnsanelementataSpecifiedIndex,3)delstatementremoveselemsbybybyselementbybyindexorslicebybyindexorslice,and 4)

toresolvea“ dermissionded”錯誤Whenrunningascript,跟隨台詞:1)CheckAndAdjustTheScript'Spermissions ofchmod xmyscript.shtomakeitexecutable.2)nesureThEseRethEserethescriptistriptocriptibationalocatiforecationAdirectorywherewhereyOuhaveWritePerMissionsyOuhaveWritePermissionsyYouHaveWritePermissions,susteSyAsyOURHomeRecretectory。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

WebStorm Mac版
好用的JavaScript開發工具

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

SublimeText3漢化版
中文版,非常好用