본문 바로가기
Python/Django

[Django] fixtures

by 코드뭉치 2023. 6. 22.

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

댓글