Django、予約サイトのモデルを作成

Python Django

概要

Djangoで、シンプルな予約サイトの作成シリーズの1つです。予約サイトを構成するためのモデルを作成していきます。

店舗モデル

今回の予約サイトでは、店舗の一覧があり、各店舗のスタッフ一覧がいます。なので、まずは店舗を表すモデルを作成しておきます。

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


class Store(models.Model):
    """店舗"""
    name = models.CharField('店名', max_length=255)

    def __str__(self):
        return self.name

何も難しいことはありません。店名だけを持つ、シンプルなモデルです。実際には、店舗のメールアドレスとか電話番号、住所、店舗の説明、そういったフィールドも必要になるでしょう。

スタッフモデル

次に、店舗に所属するスタッフを表すモデルを作ります。

class Staff(models.Model):
    """店舗スタッフ"""
    name = models.CharField('表示名', max_length=50)
    user = models.ForeignKey(
        settings.AUTH_USER_MODEL, verbose_name='ログインユーザー', on_delete=models.CASCADE
    )
    store = models.ForeignKey(Store, verbose_name='店舗', on_delete=models.CASCADE)

    class Meta:
        constraints = [
            models.UniqueConstraint(fields=['user', 'store'], name='unique_staff'),
        ]

    def __str__(self):
        return f'{self.store.name} - {self.name}'

各店舗にスタッフが所属することになるので、店舗と紐づいています。あと、表示名も持たせていますが、必要ならばプロフィールとか顔写真とか、そういうのも持たせると良いでしょう。

また、ログインして自分への予約が何件あるかを確認できる、スタッフ用のマイページを作る予定なので、Django組み込みのUserモデルと紐づけています。組み込みUserと関連付ける場合は、Userモデルを直接指定するのではなく、settings.AUTH_USER_MODELとするのがベターです。

1つの店舗のスタッフに、同じ人が重複して登録する必要はなさそうに見えるので、Meta内に指定しています。以前はunique_togetherという指定で同様のことができましたが、将来的に使えなくなるので、models.UniqueConstraint(fields=['user', 'store'], name='unique_staff'),としています。

予約モデル

予約情報を表すモデルを作ります。色々と考えられますが、今回は次のようにしています。

class Schedule(models.Model):
    """予約スケジュール."""
    start = models.DateTimeField('開始時間')
    end = models.DateTimeField('終了時間')
    name = models.CharField('予約者名', max_length=255)
    staff = models.ForeignKey('Staff', verbose_name='スタッフ', on_delete=models.CASCADE)

    def __str__(self):
        start = timezone.localtime(self.start).strftime('%Y/%m/%d %H:%M:%S')
        end = timezone.localtime(self.end).strftime('%Y/%m/%d %H:%M:%S')
        return f'{self.name} {start} ~ {end} {self.staff}'

予約の開始時間、終了時間、予約者名、誰に対しての予約か、というフィールドがあります。

予約サイトと言っても色々なものがありますし、色々な作り方が考えられます。例えばこのScheduleモデル一つとっても、開始時間と終了時間という考え方ではなく、予約日と時間帯のような作り方もあります。予約は必ず1時間ずつ、のように決まっている場合は、そのほうが色々と簡単になります。今回はもう少し汎用的な作りにしたいと思ったので、開始時間と終了時間という実装にしています。

__str__内で時間を含めた表示内容を作りたい場合は、今回のようにtimezone.localtimeを呼び出しておく必要があります。{{ obj.created_at }}みたいに、awareなdatetimeオブジェクトをテンプレートにそのまま渡した時はタイムゾーンの変換がされますが、今回はそういう訳ではないですね。

FAQ

Staffを作らず、組み込みのUserモデルを拡張して店舗と紐づける作りにできませんか

場合によってはそれでも大丈夫なのですが、一部の状況で不便になります。具体例を出すと、美容・理容室だったり接骨院だったり、そういったお店のスタッフは他店と掛け持ちするケースがあるのです。1店舗につき1Userにしちゃうと、マイページを利用する際に毎回ログインする必要が出てきます。3つの店舗に所属していれば、3回ログインする必要が出てきます。しかし今回のように、1ユーザーに対して複数のスタッフとして紐づけることができれば、ログインしているUserに紐づくStaffを全て取り出せば良いので、ログインは1度で済みます。

Relation Posts

Comment

記事にコメントする

まだコメントはありません。