[Django] RunPython in Django

Django에서 테스트를 하기위해 RunPython을 이용해서 Database에 값을 넣어보자


소개

Django에서 fixture사용하기에서 fixture를 이용해 django에서 DB에 자료를 추가하는 방법을 보았는데 이번에는 RunPython을 이용해 보겠습니다.


방법

방법은 비교적 간단하며 아래와 같습니다.

  1. [app_name]/models.py에 모델을 정의합니다.
  2. [app_name]/migrations/에 해당 모델에 대한 py를 추가합니다(하단 참조)
  3. ./manage.py makemigrations./manage.py migrate 실행


모델 작성

필요한 모델을 작성합니다. 예시를 위해서 RunPythonExample이라는 모델을 만들었습니다.

[app_name]/.models.py

from django.db import models


[...]


class RunPythonExample(models.Model):
    test_name = models.TextField()
    test_text = models.TextField()


모델에 대한 .py를 migrations 폴더에 추가

모델을 추가하였으니 해달 모델에 대한 값들을 추가하는 코드를 아래처럼 작성해서 migrations의 하위에 추가합니다. 2개의 tuple을 추가해보겠습니다.

run_python_test.py

# -*- coding: utf-8 -*-

from __future__ import unicode_literals
from django.db import migrations


def forwards_func(apps, schema_editor):

    # (app_name, 해당 앱에서 model class명)
    RunPythonExample = apps.get_model("moim", "RunPythonExample")
    db_alias = schema_editor.connection.alias
    RunPythonExample.objects.using(db_alias).bulk_create([
        RunPythonExample(test_name = "test_name_one", test_text = "test_text_one"),
        RunPythonExample(test_name = "test_name_two", test_text = "test_text_two"),
    ])


def reverse_func(apps, schema_editor):

    RunPythonExample = apps.get_model("moim", "RunPythonExample")
    db_alias = schema_editor.connection.alias
    RunPythonExample.objects.using(db_alias).filter(test_name="test_name_one").delete()
    RunPythonExample.objects.using(db_alias).filter(test_name="test_name_two").delete()


class Migration(migrations.Migration):

    dependencies = [
    ]

    operations = [
        migrations.RunPython(forwards_func, reverse_func),
    ]


명령어 실행 및 확인

명령어를 실행해서 이제 확인을 해봅시다.

python ./manage.py makemigrations
python ./manage.py migrate
python ./manage.py runserver