1️⃣ Django fixture
Django fixture는 애플리케이션에서 사용하는 데이터를 JSON 형식으로 저장해두고,
나중에 사용할 수 있도록 하는 기능이다.
운영 서버에 배포하기 전에 초기 데이터 작업을 수행하거나,
테스트 데이터를 생성하는 등의 목적으로 사용할 수 있다.
2️⃣ Django fixture의 주요 기능
fixture는 데이터 초기화나 테스트 데이터 생성 등에서 사용할 수 있다.
애플리케이션에서 사용하는 모든 모델을 대상으로,
데이터를 추출하고 로딩할 수 있다는 점에서 유용하게 사용할 수 있다.
dumpdata와 loaddata는 Django의 스키마 변화에 대응하여
데이터를 추출하고 로딩할 수 있어, 데이터 마이그레이션 등에서도 사용할 수 있다.
3️⃣ dumpdata
- Django에서 제공하는 manage.py 명령어를 사용하여 데이터를 JSON 형식으로 출력하는 기능
이 명령어를 사용하면 애플리케이션 내의 모든 데이터를 JSON 파일로 추출할 수 있다.
예시)모든 모델 데이터를 추출하려면 다음과 같이 입력
python manage.py dumpdata > data.json
예시) 추출된 json 파일
[
{
"model": "users.user",
"pk": 1,
"fields": {
"created_at": "2023-06-09T09:41:39.468",
"updated_at": "2023-06-19T11:36:35.976",
"email": "admin@admin.com",
"nickname": "ADMIN",
...
},
...
]
4️⃣ loaddata(JSON 파일에 있는 모든 데이터를 간단하게 로딩하고 저장할 때)
- JSON 파일로부터 데이터를 로딩하는 기능
이를 사용하면 데이터를 애플리케이션으로 가져와 초기 데이터 작업을 수행할 수 있다.
fixture를 저장하는 방법은
터미널에 loaddata 명령어를 입력해주면 된다.
예시) myfixture.json의 모든 데이터를 데이터베이스로 로드하기.
python manage.py loaddata myfixture.json
이 방법은 간편하게 데이터를 json파일로부터 로드해올 수 있다. 하지만 다른 복잡한 과정을 추가할 수는 없다.
따라서 추가적인 데이터 재가공, 필터링 등의 작업이 필요할 때는 다음 방법을 사용해주어야 한다.
5️⃣ deserialize
- 데이터를 필터링하거나 재가공해서 저장해야 할 때)
변환은 Django의 models.deserialize 함수를 사용하여 수행
예를 들어, 다음과 같이 JSON 데이터를 파이썬 객체로 변환할 수 있다.
from rest_framework import serializers
from myapp.models import MyModel
data = open('data.json', 'rb')
for obj in serializers.deserialize('json', data):
if isinstance(obj.object, MyModel):
obj.save()
이 때, MyModel은 추출된 데이터의 모델명을 의미한다.
위 코드에서는 if 문을 사용하여 해당 모델에 대한 객체만 저장하도록 했다.
6️⃣ 주의 사항
- 사용자 비밀번호
dumpdata 명령어로 사용자 데이터를 추출할 때,
사용자 비밀번호는 해시되지 않은 평문으로 그대로 추출 되므로,
보안을 생각한다면 이 부분은 주의해서 처리해야 한다.
(DB에 해싱된 상태로 저장된 PW는 Json파일에서도 해싱된 상태로 되어있지만,
DB에 해싱되지 않은 PW가 들어있다면 dumpdata에서 해싱을 따로 해주지 않는다는 뜻)
- ManyToManyField
ManyToManyField로 정의된 데이터 모델이 있는 경우,
이를 처리하는 방법에서 오류가 발생할 수 있다.
Django fixture가 직접 ManyToManyField 데이터를 처리하지 않으므로,
이를 처리하기 위해서는 추가적인 작업이 필요하다.
- 참조 무결성
참조 무결성 조건을 만족시키지 않는 데이터를 불러온 경우, 오류가 발생할 수 있다.
따라서 데이터를 로딩하기 전에, 먼저 데이터베이스의 데이터를 초기화하는 것이 좋다.
'Python > Django' 카테고리의 다른 글
[DRF] permission_classes = [A, B]와 [A & B]의 차이 (5) | 2023.06.21 |
---|---|
[Django] bulk_create (0) | 2023.06.16 |
[DRF] Permissions (0) | 2023.06.10 |
[DRF] GenericAPIView와 Mixins (0) | 2023.06.07 |
[DRF] ModelSerializer와 CreateModelMixin 사용하기 (0) | 2023.06.06 |
댓글