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().〜で親クラスのメソッドを継承したうえでオーバーライドしていることにも注意。

最終更新

役に立ちましたか?