投稿日:2019年11月6日
Djangoは簡単にWebアプリケーションを作成できるフレームワークです。この記事は初心者の方向けのDjangoチュートリアルです。
ここではDjangoにおけるデータベース構造の定義方法について解説していきます。
Djangoはデータベースの管理にORM(Object-Relational-Mapping)を採用していてデータベースの構造をModelを定義することで構成していきます。Modelを使うとSQLより簡単にデータベースの管理を行うことができます。
DjangoにおいてModelはmodels.pyファイル内に記述されたdjango.db.models.Modelを継承したクラスのことを指します。Modelクラスの変数(attribute)には定義したいデータベースのフィールドを定義します。定義した変数がそのままの名前でデータベースのフィールドになります。
よくあるExeclのような名簿で例えるとシートがModel、カラムのヘッダがフィールド(変数)、それぞれのデータがレコードになります。
まずはブログの記事としてArticleというModelクラスを定義してみましょう。
from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
class Article(models.Model):
STATUS_CHOICES = ( # 公開状態の選択肢
('draft', 'Draft'),
('published', 'Published'),
)
###### フィールド定義 ##################################################
title = models.CharField(max_length=250) # 記事タイトル
author = models.ForeignKey(User, # 記事筆者
on_delete=models.CASCADE,
related_name='blog_articles')
body = models.TextField() # 記事本文
publish = models.DateTimeField(default=timezone.now) # 公開日
created = models.DateTimeField(auto_now_add=True) # 記事作成日
updated = models.DateTimeField(auto_now=True) # 記事最終編集日
status = models.CharField(max_length=10, # 公開状態
choices=STATUS_CHOICES,
default='draft')
########################################################################
class Meta:
"""
ModelクラスのMetaクラス。
記事の並び順やレコードでかぶりがあってはいけないフィールドなど
ここで指定できる
公式ドキュメント:
https://docs.djangoproject.com/ja/2.2/ref/models/options/
"""
ordering = ('-publish',) # 記事の並び順。新しいものから順に並ぶ。
def __str__(self):
"""
モデルを文字列として扱う際何を表示するかを定義するメソッド
Djangoの管理サイトでの表示や
print()
で表示した時などはここが呼ばれる
"""
return self.title
ここではそれぞれのフィールドについて解説します。
フィールドをどのメソッドで指定すれば良いのかはそのフィールドに入る値によって変わります。悩んだ時にはDjangoの公式ドキュメントを参照しましょう。
(Django2.2公式ドキュメント:https://docs.djangoproject.com/ja/2.2/ref/models/fields/)
Metaクラスではそのモデルの設定の様なものを書くことができます。例えば、今回の様な記事のモデルの場合、デフォルトで全ての記事を取得したときに公開日(publish)のフィールドの値が新しいものから順に並んでいると使いやすそうです。そのような場合ordering変数にタプルを渡します。
class Article(models.Model):
[...]
class Meta:
ordering = ('-publish',) # 記事の並び順。新しいものから順に並ぶ。
ここでordering=("publish")ではなくordering=("-publish")になっていることに注意してください。ordering引数は渡された値が小さい順に並べます。つまりordering=("publish",)にするとpublishが小さい順、つまりpublishの日時が古い順に並んでしまうのです。その順序を逆にしたいときには今回の様に引数のフィールド名の先頭に - をつけます。
class Article(models.Model):
[...]
class Meta:
ordering = ('publish',) # これだと古い順に並びます。
Metaクラスには他にも指定できる値が色々あります。なれてきたら色々探してみましょう。
(Django2.2公式ドキュメント:https://docs.djangoproject.com/ja/2.2/ref/models/options/)
__str__メソッドはPython3でクラスを文字列として表示する際に呼ばれるクラスです。Djangoの管理サイトで表示される名前もここで返される値になります。