茨の道も一歩から

40代後半の田舎住まい無職。再就職先が決まるまでの茨の道を記録します。

Django入門:Blogアプリの制作 - データベース

はじめに

モデルの作成

blog\models.py

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

# Create your models here.
class Article(models.Model):
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    text = models.TextField()
    created_date = models.DateTimeField(default=timezone.now)
    published_date = models.DateTimeField(blank=True, null=True)

    def publish(self):
        self.published_date = timezone.now()
        self.save()
    
    def __str__(self):
        return self.title

モデルの登録

blog\admin.py

from django.contrib import admin

# Register your models here.
from .models import Article

admin.site.register(Article)

データベースの設定

sqlite3

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

MySQL

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': DB名,
        'USER': ユーザ名,
        'PASSWORD': パスワード,
        'HOST': ホスト名,
        'PORT': '3306',
    }
}

PostgreSQL

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': DB名,
        'USER': ユーザ名,
        'PASSWORD': パスワード,
        'HOST': ホスト名,
        'PORT': '5432',
    }
}

データベースへ反映

マイグレーションファイルの作成

python manage.py makemigrations blog

blog\migrations\0001_initial.py

# Generated by Django 3.1 on 2020-09-03 00:55

from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone


class Migration(migrations.Migration):

    initial = True

    dependencies = [
        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
    ]

    operations = [
        migrations.CreateModel(
            name='Article',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('title', models.CharField(max_length=200)),
                ('text', models.TextField()),
                ('created_date', models.DateTimeField(default=django.utils.timezone.now)),
                ('published_date', models.DateTimeField(blank=True, null=True)),
                ('author', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
            ],
        ),
    ]

発行sqlの確認

python manage.py sqlmigrate blog 0001
BEGIN;
-- Create model Article
CREATE TABLE "blog_article" (
    "id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
    "title" varchar(200) NOT NULL,
    "text" text NOT NULL,
    "created_date" datetime NOT NULL,
    "published_date" datetime NULL,
    "author_id" integer NOT NULL REFERENCES "auth_user" ("id") DEFERRABLE INITIALLY DEFERRED
);
CREATE INDEX "blog_article_author_id_905add38" ON "blog_article" ("author_id");
COMMIT;

テーブルの作成

python manage.py migrate

管理サイト

管理者ユーザ

スーパユーザの作成

python manage.py createsuperuser

設定項目

項目
ユーザ名 admin
メールアドレス admin@example.com
パスワード myPassword

動作確認


データベース操作

全記事データ取得

Article.objects.all()

フィルタリング記事データ取得

Article.objects.filter(created_data__lte=timezone.now())

記事データのソート

Article.objects.all().order_by('publised_data')

ユーザデータ取得

me = User.objects.get(username='admin')

記事データの追加

Article.objects.create(author=me, title='Sample Article', text='This Article is sample page.')

フィルタリングと並び替え

filter

フィルタ 説明
author=me authorがmeと一致
title__contains='Django' titleフィールドに'Django'を含む
published_date__lte=timezone.now() 今日以前

order_by

フィルタ 説明
Article.objects.order_by('created_date') created_date昇順
Article.objects.order_by('-created_date') created_date降順

終わりに

  • 今回は、データベースの使い方をご紹介しました。