Model(DB)

データベース関連

ブログ記事用にmodelsで定義するテーブルは以下の3つ。

  • Category

  • Tag

  • Article

blog/models.pyのソースコードは以下。詳細の説明は各セクション を参照。

必要なパッケージは各クラスの基底クラスとなるmodelsをdjango.dbからimportしている。また記事作成日時などを取得するために、django.utilisからtimezoneをimport。

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

# Create your models here.
class Category(models.Model):
	class Meta:
		# テーブル名
		db_table = "Category"

	name      = models.CharField('カテゴリ', max_length=20, unique=True)
	slug      = models.SlugField(unique=True)
	timestamp = models.DateTimeField(auto_now_add=True)

	def __str__(self):
		return self.name


class Tag(models.Model):
	class Meta:
		# テーブル名
		db_table = "Tag"

	name      = models.CharField('タグ名', max_length=255, unique=True)
	slug      = models.SlugField(unique=True)
	timestamp = models.DateTimeField(auto_now_add=True)

	def __str__(self):
		return self.name

class Article(models.Model):
	class Meta:
		# テーブル名
		db_table = "Article"
		ordering = ['-section']

	""" 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):

最終更新

役に立ちましたか?