ホームページ >バックエンド開発 >Python チュートリアル >ハードコードされた ID を使用しない外部キーを使用した Django フィクスチャの使用
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>
これにより、フィクスチャ内の ID ではなく、name
によってカテゴリを参照できるようになります。
数値 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 フィクスチャの使用の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。