the dawn of yuriko hisory

アニメやら漫画関係で何か作りたいものと勉強したことのメモ用

DjangoGirlsに挑戦~Djangoモデル~

Djangoモデル

DBは標準のsqlite3を使用

アプリケーションの作成

Visual StudioだとDjangoアプリの追加で簡単に作成できる
blogを作成

以下ディレクト

project/
├ manage.py
├ app/
│   ├ __init__.py
│   ├ settings.py
│   ├ urls.py
│   └ wsgi.py
└ blog/
     ├ migrations
     ├ _init_.py
     ├ admin.py
     ├ models.py
     ├ tests.py
     └ views.py

アプリケーション追加後はそれをDjangoで使用できるようsettings.pyを修正

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'blog', #追加
]

モデルの作成

blogアプリケーションからDBを操作するためのモデルを作成
Django girlsではブログを作成していくので
投稿する内容が入るPostモデルを作成

from django.db import models //1
from django.utils import timezone

class Post(models.Model): //2
    author = models.ForeignKey('auth.User') //3
    title = models.CharField(max_length=200) //4
    text = models.TextField() //5
    created_date = models.DateTimeField(default=timezone.now) //6
    published_date = models.DateTimeField(blank=True, null=True) //7

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

    def __str__(self): //9
        return self.title

1.
from 〇〇 import ××は
django.dbの中のmodelsメソッドだけを呼びますよーって宣言
普通にimport django.dbでも問題ないけどその場合

import django.db

class Post(django.db.models.Model):
    author = django.db.models.ForeignKey('auth.User')

とかってなって非常に面倒くさいのでfrom importを使って宣言することが多い

2.
class宣言したPostオブジェクトがモデルになる。
django.db.models.Modelを使用することで、Djangoのモデルとして扱う


3.
モデルに対してプロパティを定義
設定したものがそのままDBにも定義される
models.ForeignKey()は引数に渡したモデルへのリンク
('auth.User')はDjangoが元から作成しているUserクラスをリンクしていることになる
Userの追加方法は後ほどやることになる

4.
modelsCharField() 文字列を扱うmax_lengthは必須項目なので忘れるとmakemigration実行時にエラーが吐かれるので注意

5.
models.TextField() テキストを扱うがCharFieldと違って制限なしの長いテキストを取り扱う
ブログ記事などの文章を取り扱う際に使用することになる

6.
models.DateTimeFiled(default=timezone.now) 日付と時刻を扱う
同じようなものでDateFieldがあって混同するが
DateFieldはDatetime.dateインスタンスによって表示される
DateTimeFiledはDatetime.datetimeインスタンスによって表示される
つまりDateFieldは日付、DateTimeFiledは日付+時刻になる
ブログなどの書いた時刻がわかった方が良いコンテンツはDateTimeFiledを使用する
(default=timezone.now)はデフォルトの値にそのまま現在の時刻を突っ込んでいるだけ

7.
blank=True DB登録時に空白を許可
null=True DB登録時にnullを許可

8.
モデル内だけど関数
selfはクラスのインスタンス自身を表しているらしい

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

ざっくりとメソッドの動きはpublished_date(投稿日)を今の時間にセットして
save()でDBに登録してるんだなとわかる
実際にどう動いているかは登録処理時にわかるかな?

9.
__str__でクラスを文字列化している
JavaとかのtoString()をイメージするのがよさそう

テーブル作成

makemigrationとmigrate
VSならボタンポチポチで終了