【開発メモ】Djangoでダミーデータを生成するFakerモジュールについて

はじめに

久しぶりにDjangoネタを少しメモ程度に書いておこうと思った。

参考動画 – YouTube

Fakerモジュール

該当モジュール「Faker」を使ってダミーデータを生成する方法。

https://pypi.org/project/Faker/

加えてテストデータなどを生成する際にこういったモジュールを使うことによって手間が省けるな、と感じています。

大きな枠でいうとテストケースを作成するのに手一杯で、許容文字数であったり、その他文字列のパターンなどを検討して作成するって結構手間だよな、と。
もちろんそういった生成ツールを使えばいいのかもしれないけど。

なんだかんだ面倒だから、調べてみようと思った次第。

導入手順

まずはpipを使ってインストールする。

pip install django-faker

毎回思うがモジュール名に加えてdjangoとつくのがややこしいですよね。

インストールできたら、念のためpip freezeを実行して確認しましょう。

pip freeze

インストールが確認できたら、プロジェクトフォルダ内のsettings.py内部に以下を追記します。

INSTALLED_APPS = (

    # ...
    'django_faker', #追記する
)

FAKER_LOCALE = None     # settings.LANGUAGE_CODE is loaded
FAKER_PROVIDERS = None  # faker.DEFAULT_PROVIDERS is loaded (all)

あとはmodels.py内部に追記をします。

from django_faker import Faker
# this Populator is only a function thats return a django_faker.populator.Populator instance
# correctly initialized with a faker.generator.Generator instance, configured as above
populator = Faker.getPopulator()

from myapp.models import Game, Player
populator.addEntity(Game,5)
populator.addEntity(Player,10)

insertedPks = populator.execute()

テンプレートタグを使ってダミーデータの表示も行えるのは非常に手軽で便利ですよね。

{% fake 'name' as myname %}{% fake 'dateTimeBetween' '-10d' as mydate %}

{{ myname|title }} - {{ mydate|date:"M Y" }}



{% load fakers %}

<?xml version="1.0" encoding="UTF-8"?>
<contacts>
    {% fake 'randomInt' 10 20 as times %}
    {% for i in 10|get_range %}
    <contact firstName="{% fakestr 'firstName' %}" lastName="{% fakestr 'lastName' %}" email="{% fakestr 'email' %}"/>
        <phone number="{% fakestr 'phoneNumber' %}"/>
        {% if 'boolean'|fake:25 %}
        <birth date="{{ 'dateTimeThisCentury'|fake|date:"D d M Y" }}" place="{% fakestr 'city' %}"/>
        {% endif %}
        <address>
            <street>{% fakestr 'streetAddress' %}</street>
            <city>{% fakestr 'city' %}</city>
            <postcode>{% fakestr 'postcode' %}</postcode>
            <state>{% fakestr 'state' %}</state>
        </address>
        <company name="{% fakestr 'company' %}" catchPhrase="{% fakestr 'catchPhrase' %}">
        {% if 'boolean'|fake:25 %}
            <offer>{% fakestr 'bs' %}</offer>
        {% endif %}
        {% if 'boolean'|fake:33 %}
            <director name="{% fakestr 'name' %}" />
        {% endif %}
        </company>
        {% if 'boolean'|fake:15 %}
        <details>
        <![CDATA[
        {% fakestr 'text' 500 %}
        ]]>
        </details>
        {% endif %}
    </contact>
    {% endfor %}
</contacts>

その他ページ遷移をurls.pyに追記することでダミーデータを使ったテンプレートの表示も行えます。

テストデータを毎回作るのもめんどくさい、あとは実際に使われるデータのパターンを検討し洗い出すのが面倒な場合など特に個人開発では非常に手軽に使えるのが便利と感じました。