モデルの作成

Djangoではモデルをとおして、データベースを構築します。

モデルを使用することで、SQLを意識することなくデータベースを操作することができます。

モデルを定義するにはmodels.pyに追加します。

まずは、投稿機能を作成していきます。

Postモデルを追加します。

クラスを追加し、各プロパティを定義していきます。

ForeignKey、CharField、TextField、DateTimeFieldなどのフィールド解説は公式ドキュメントを参考にして下さい。

https://docs.djangoproject.com/ja/2.2/ref/models/fields/#charfield

フィールドクラス

  • ForeignKey
    • 多対1の関係で他のモデルへのリンク
  • CharField
    • 文字列のフィールド
  • TextField
    • 多量のテキストのフィールド
  • DateTimeField
    • 日付と時刻のフィールド
  • IntegerField
    • 整数のフィールド
  • FloatField
    • 小数のフィールド

フィールドオプション

フィールドクラスで使えるオプションです。

  • null
    • データベースのNULL可否を設定
  • blank
    • フォームフィールドのブランク可否を設定
  • choices
    • フォームの選択枠を設定
  • default
    • デフォルト値を設定
  • unique
    • ユニーク制約を設定
  • verbose_name
    • フィールド名を設定
  • validators
    • バリデーションの設定

リレーションフィールドクラス

ForeignKeyを使用すると、モデルクラス間で関連付けをすることができます。

  • OneToOneField
    • 1 対 1
  • ForeignKey
    • 1 対 多
  • ManyToManyField
    • 多 対 多

on_deleteオプション

  • models.CASCADE
    • 一緒に削除される
  • models.PROTECT
    • 削除できない
  • models.SET_NULL
    • NULLがセットされる
  • models.SET_DEFAULT
    • デフォルト値がセットされる
  • models.SET
    • 任意の値がセットされる
  • DO_NOTHING
    • 何もしない

モデルを作成

blog/models.py

from django.conf import settings
from django.db import models
from django.utils import timezone
from django.urls import reverse


class Post(models.Model):
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    text = models.TextField()
    created_date = models.DateTimeField(default=timezone.now)
    published_date = models.DateTimeField(blank=True, null=True)

    def publish(self):
        self.published_date = timezone.now()
        self.save()

    def get_absolute_url(self):
        return reverse("post_detail", kwargs={'pk':self.pk})

    def __str__(self):
        return self.title

データベースにモデルのためのテーブルを作成

モデルを変更したら、下記コマンドで必ずデータベースの再構築が必要になります。

(myvenv) ~$ python3 manage.py makemigrations blog
(myvenv) ~$ python3 manage.py migrate blog

results matching ""

    No results matching ""