모델에 초기 데이터를 제공하는 방법¶
앱을 처음 설정할 때 하드 코딩된 데이터로 데이터베이스를 미리 채우는 것이 때때로 유용합니다. 마이그레이션이나 fixtures를 사용하여 초기 데이터를 제공할 수 있습니다.
마이그레이션을 사용해 초기 데이터 제공하기¶
앱의 초기 데이터를 자동으로 로드하려면 :ref:`데이터 마이그레이션<data-migrations>`을 생성하세요. 마이그레이션은 테스트 데이터베이스를 설정할 때 실행되므로 데이터도 해당 데이터베이스에서 사용할 수 있습니다. 다만 :ref:`몇 가지 제한 사항<test-case-serialized-rollback>`이 있습니다.
fixtures를 사용해 데이터 제공하기¶
fixtures<fixtures-explanation>`를 사용하여 데이터를 제공할 수도 있습니다. 다만 이 데이터는 :attr:.TransactionTestCase.fixtures`를 사용하지 않는 한 자동으로 로드되지 않습니다.
고정 장치는 Django가 데이터베이스로 가져오는 방법을 알고 있는 데이터의 모음입니다. 데이터가 이미 있는 경우 고정장치를 만드는 가장 간단한 방법은 :tembadmin:’manage.py dumpdata’ 명령을 사용하는 것입니다. 또는 수동으로 고정장치를 작성할 수 있으며 고정장치는 JSON, XML 또는 YAML(PyYAML_installed) 문서로 작성할 수 있습니다. :doc:’직렬화 설명서’는 지원되는 각:ref:’직렬화 형식’에 대한 자세한 정보를 제공합니다.
그러나 한 예로 JSON에서 “사람” 모델의 고정장치는 다음과 같습니다.
[
{
"model": "myapp.person",
"pk": 1,
"fields": {
"first_name": "John",
"last_name": "Lennon"
}
},
{
"model": "myapp.person",
"pk": 2,
"fields": {
"first_name": "Paul",
"last_name": "McCartney"
}
}
]
그리고 YAML로 된 동일한 fixture 가 있습니다.
- model: myapp.person
pk: 1
fields:
first_name: John
last_name: Lennon
- model: myapp.person
pk: 2
fields:
first_name: Paul
last_name: McCartney
이 데이터는 앱 안에 있는 “고정장치” 디렉토리에 저장됩니다.
:djadmin:’manage.py loaddata <loaddata>` ``<fixturename>``를 호출하여 데이터를 로드할 수 있습니다. ``<fixturename>``는 당신이 만든 fixture 파일의 이름입니다. :djadmin:`loaddata`를 실행할 때마다 데이터는 고정장치에서 읽혀져 데이터베이스에 다시 로드됩니다. 이는 고정 장치에 의해 생성된 행 중 하나를 변경한 후 :djadmin:`loaddata`를 다시 실행하는 경우, 변경 내용이 모두 지워진다는 의미입니다.
Django가 fixture 파일을 찾을 위치 지정하기¶
기본적으로 Django는 각 앱 내부의 fixtures 디렉토리에서 fixtures를 찾습니다. 따라서 loaddata sample 명령을 실행하면 my_app/fixtures/sample.json``파일을 찾습니다. 이는 상대 경로에서도 동일하게 동작하므로 ``loaddata my_app/sample 명령을 실행하면 my_app/fixtures/my_app/sample.json 파일을 찾습니다.
또한 Django는 FIXTURE_DIRS 설정에 지정된 디렉토리에서도 fixtures를 찾습니다.
기본 검색이 수행되지 않도록 하려면 fixture 파일의 위치를 절대 경로로 지정하세요. 예: loaddata /path/to/sample
fixture 파일에 네임스페이스 적용하기
Django는 이름이 일치하는 첫 번째 fixture 파일을 찾아 사용하므로, 서로 다른 애플리케이션에 동일한 이름의 fixture 파일이 있는 경우 loaddata 명령에서 이를 구분할 수 없습니다. 이 문제를 방지하는 가장 쉬운 방법은 fixture 파일에 *네임스페이스를 적용하는 것*입니다. 즉, 위의 상대 경로 예시처럼 애플리케이션 이름으로 된 디렉토리 안에 fixture 파일을 넣는 것입니다.
더 보기
또한 :ref:’testing framework’에서는 고정장치를 사용하여 일관된 테스트 환경을 설정할 수 있습니다.