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 픽스쳐의 자연 키는 데이터 유연성과 관리성을 향상시킵니다. 잠재적으로 변경되는 ID에 의존하는 대신 Django는 관계를 동적으로 해결하여 더욱 강력한 고정 장치를 만듭니다. 더 간단한 픽스쳐 관리와 문제 감소를 위해 Django 프로젝트에 자연 키를 통합하세요.
위 내용은 하드코딩된 ID 없이 외래 키와 함께 Django Fixture 사용의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!