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ならボタンポチポチで終了