> 백엔드 개발 > 파이썬 튜토리얼 > 하드코딩된 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>
로그인 후 복사

이를 통해 픽스처 내의 ID 대신 name으로 카테고리를 참조할 수 있습니다.


2단계: 자연 키를 사용하여 Fixture 만들기

숫자 ID 대신 자연키를 사용해 외래키를 참조하세요.

Fixture 예(숫자 ID – 오래된 방법)

<code class="language-json">[
    {
        "model": "shop.category",
        "pk": 1,
        "fields": {
            "name": "Electronics"
        }
    },
    {
        "model": "shop.product",
        "fields": {
            "name": "Smartphone",
            "category": 1
        }
    }
]</code>
로그인 후 복사

Fixture 예(자연 키 – 개선된 방법)

<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(기존 접근 방식).
  • 자연 키(적응성이 더 높음).

필요에 따라 결합하세요.


자연키는 언제 사용하나요?

다음과 같은 경우 자연 키를 사용하세요.

  • 교차 데이터베이스 픽스쳐 호환성이 필요합니다.
  • 모델에 고유한 필드(예: 사용자 이름, 슬러그, 이름)가 있습니다.
  • 수동 ID 추적은 피해야 합니다.

다음과 같은 경우 숫자 ID를 사용하세요.

  • 모델에 고유한 자연 식별자가 없습니다.
  • 작고 변하지 않는 데이터 세트로 작업합니다.

결론

Django 픽스쳐의 자연 키는 데이터 유연성과 관리성을 향상시킵니다. 잠재적으로 변경되는 ID에 의존하는 대신 Django는 관계를 동적으로 해결하여 더욱 강력한 고정 장치를 만듭니다. 더 간단한 픽스쳐 관리와 문제 감소를 위해 Django 프로젝트에 자연 키를 통합하세요.

위 내용은 하드코딩된 ID 없이 외래 키와 함께 Django Fixture 사용의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿