Article Class
ブログアプリで投稿するコンテンツのモデル。categoryはすでに作成しているCategory classを外部キー(一対他参照)として参照している。tagsも同様だが、複数指定が可能なManyToManyFieldになっていることに注意。
Fields
Description
category
Categoryクラスの外部key
必須
title
コンテンツのタイトル
必須
section
セクション
任意
text
コンテンツの中身
任意
tags
タグ、複数設定可能
任意
created_at
コンテンツが作成された日
自動で
updated_at
コンテンツが更新された日
自動で
published_at
コンテンツが公開された日
自動で
is_public
コンテンツの公開状況
必須
Articleクラス内のMeta Classでは、管理画面で表示するテーブル名を記載する。 また__str__メソッドをオーバライドすることで、classの表示名を定義している。
class Article(models.Model):
class Meta:
# テーブル名
db_table = "Article"
""" Article data """
category = models.ForeignKey(Category, on_delete=models.PROTECT)
title = models.CharField('タイトル', max_length=20)
section = models.CharField('章', max_length=20, blank=True)
text = models.TextField('本文')
tags = models.ManyToManyField(Tag, verbose_name='タグ', blank=True)
created_at = models.DateTimeField('作成日', default=timezone.now)
updated_at = models.DateTimeField('更新日', default=timezone.now)
published_at = models.DateTimeField(blank=True, null=True)
is_public = models.BooleanField('公開状況', default=True)
def save(self, *args, **kwargs):
if self.is_public and not self.published_at:
self.published_at = timezone.now()
super().save(*args, **kwargs)
def __str__(self):
return self.title
created_atやupdated_atは自動で時刻が保存されるようになっているが、published_atはデフォルトではnull値を指定している。
公開された日時を保存するために、「公開フラグONで、公開日が設定されていない場合」(=null、つまり初稿or公開し直したとき)に、保存時の時刻を入力するようにsaveメソッドをオーバーライドしている。
super().〜で親クラスのメソッドを継承したうえでオーバーライドしていることにも注意。
最終更新
役に立ちましたか?