Django

Djangoで最小単位のアプリ構築

ゴールの確認

以下は最終的なディレクトリ構造です。

.
├── config
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── core
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models
│   │   ├── __init__.py
│   │   └── user.py
│   ├── serializers
│   │   ├── __init__.py
│   │   └── userSerializer.py
│   ├── tests
│   │   └── __init__.py
│   └── views
│       ├── __init__.py
│       └── userView.py
├── Pipfile
├── Pipfile.lock
└── manage.py

準備とプロジェクト作成

必要なファイルを作成

.gitignore

次にgitの管理対象から外すファイル・フォルダを指定します。

$ touch .gitignore
$ echo -e ‘.venv\n.env\nPipfile.lock’ >> .gitignore

.env

$ touch .env

仮想環境にライブラリをインストール

まずは、pipenvを用いて仮想環境を構築していきます。構築した仮想環境内に開発で使うライブラリをインストールします。

$ pipenv --python 3.7

Pipfileが生成されたと思うので、下記の様に編集してください。

Pipfileの[scripts]に以下のように定義することで、短いコマンドを指定できます。

[dev-packages]
pylint = "*"

[packages]
django = "==2.2"
djangorestframework = "*"
gunicorn = "*"
mysqlclient = "*"

[scripts]
server = "python manage.py runserver"
shell = "python manage.py shell"
makemigrations = "python manage.py makemigrations"
sqlmigrate = "python manage.py sqlmigrate"
migrate = "python manage.py migrate"
showmigrations = "python manage.py showmigrations"
check = "python manage.py check"
createsuperuser = "python manage.py createsuperuser"
wsgi = "gunicorn config.wsgi:application"

$ pipenv install

プロジェクトを作成

$ pipenv run django-admin startproject config .

アプリケーションを作成(core)

$ pipenv run django-admin startapp core

アプリケーションの読み込みと設定変更

INSTALLED_APPS = [
    ・・・
    'rest_framework', # 追加
    'core.apps.CoreConfig', # 追加
]

ALLOWED_HOSTS = ['*'] # 変更

LANGUAGE_CODE = 'ja' # 変更

TIME_ZONE = 'Asia/Tokyo' # 変更

Modelを作成

__init__.py

from .user import User

user.py

from django.db import models

class User(models.Model):
    class Meta:
        db_table = 'users'

    name = models.CharField(max_length=50)
    email = models.CharField(max_length=254)
    password = models.CharField(max_length=128)
    address = models.CharField(max_length=50, null=True)
    last_login = models.DateTimeField(null=True)
    is_active = models.BooleanField()

    def __str__(self):
        return self.name

本来はカスタムユーザーを作成します。カスタムユーザーについては、以下を参考にしてください。
カスタムユーザーサンプル

データベースとの接続

MySQL内にデータベースを作成

$ mysql -u root
> create database [データベース名];

接続情報の編集

.env

DB_NAME=[データベース名]
DB_HOST=[ホスト名]
DB_PORT=[ポート番号]
DB_USERNAME=root
DB_PASSWORD=

config/settings.py

接続するデータベースをMySQLに変更し、

import os

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'HOST': os.environ['DB_HOST'],
        'PORT': os.environ['DB_PORT'],
        'NAME': os.environ['DB_NAME'],
        'USER': os.environ['DB_USERNAME'],
        'PASSWORD': os.environ['DB_PASSWORD']
    }
}

テーブルを作成(migrateを実行)

$ pipenv run python manage.py migrate

Serializerを作成

__init__.py

from .userSerializer import UserSerializer

userSerializer.py

from rest_framework import serializers
from core.models import User

class UserSerializer(serializers.HyperlinkedModelSerializer):

    class Meta:
        model = User
        fields = ['id', 'name', 'email']

Viewを作成

__init__.py

from .userView import UserViewSet

userView.py

from django.http import HttpResponse
from rest_framework import viewsets

from core.models import User
from core.serializers import UserSerializer


class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer

urls.pyを作成

urls.py

from django.contrib import admin
from django.urls import path, include
from rest_framework import routers

from core.views import UserViewSet

router = routers.DefaultRouter()
router.register('users', UserViewSet) # 'api/users/'

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include(router.urls)),
]

COMMENT

メールアドレスが公開されることはありません。