Maeilyホテルプロジェクト後記!


プロジェクト後期!


新しい気持ちでスタートした2週間目のプロジェクトもやっと終わりました!
最初のプロジェクトに比べて、一日が短くなったので、焦っていました.
しかし、最初のプロジェクトでは、盲目的にゼロベースから始めるのとは違って、もっと楽に行われているようだ.
(経験の大切さ…)
プロジェクトのテーマが選択され、「デイリーホテル」というサイトを担当しています.
最初は「普通のビジネスサイトと変わらないですよね?」こんな想いで
初めてとは違う性格のサイトを作りたいのでがっかりしましたが.
だんだん、私はその考えが大間違いだと気づいた.
(すごい錯覚ですね…)
初めてモデリングをしたとき、一番悩んだのは
一つのホテルには部屋の種類があり、部屋ごとに数が限られています.
各日付の部屋が満室であれば、その部屋を予約することはできません.
処理に本当に悩んでいます.
そして、同じ時期に悩んでいる人の考えを聞きました.
日付による在庫管理が可能なテーブルを別途手配することをお勧めします.
これを基にテーブルを作りました.
たとえば、
id残り部屋日付room id 1102021.08.2012192021.08.2023202021.08.211
対応する部屋で予約するたびに、上の表のように表示されます.
残りの部屋は一つ一つ閉じ込められている.
しかし、このテーブルがない場合、私たちはその存在を十分に判断することができます.
最終的にERDは以下の在庫表を消去し設計した.

メモリコード


記憶中のコードは正しいかどうかを判断する場所で発生する.

ホテルのリストで、チェックイン日とチェックアウト日を受け取ると、
適切な日付で計画リストを表示し、その数値を計算します.
部屋の総数から減算する論理を実現するために、
from django.db.models import Sum, Count, F, Q
from stays.models import Staytype
from datetime import date
check_in  = date(2021,8,21)
check_out = date(2021,9,1)
q1 = Q(room__book__check_in__range = [check_in, check_out])
q2 = Q(room__book__check_out__range = [check_in, check_out])
q3 = Q(room__book__check_in__lte = check_in, room__book__check_out__gte = check_out)
stays = Staytype.objects.anotate(
	remains = Sum(F('room__quantity'), distinct = True)
         	- Count(F('room__book_id'), filter = (q1|q2|q3), distinct = True))
以上の方法を試してみましたが、roomからbookまでの表
モーテルはroom_optionが複数あるのでエラーが発生し、
正しく演算されていない.
(room_optionの中で宿泊のみが存在するホテルと異なり、旅館には宿泊と大部屋の2つが存在する)
この問題を解決するために、いろいろな方法を考えています.Subqueryを使用して解決されます.
from django.db.models import Subquery, OuterRef
booked_count = Staytype.objects.annotate(
	booked_count = Count('room__book__id',
    		       filter = (q1|q2|q3))).filter(pk = OuterRef('pk'))
stays = Staytype.objects.anotate(
	total = Sum('room__quantity'),
        booked_count = Subquery(booked_count.values('booked_count')))
OuterRefSubqueryの参照値として設定します.
対応する値を指定すると、クエリに基づいて所定のcountの値が読み込まれます.
今回のプロジェクト期間は本当にたくさんの収穫がありました.
最初の段階では、Scrumの開発を通じてコラボレーションの重要性を知ることができます.
2つ目のプロジェクトは機能開発に重点を置き、この方向に向かって発展してきた.
(もちろん、これはScrumを守っていないという意味ではありません.)
カレンダーセクションの対応する日付の部分をアップロードおよび保存するのではなく、画像ファイルの部分をアップロードおよび保存します.
そして再包装され、
オブジェクト向けプログラミング.
コードの再利用、コード重複保護、メンテナンスなどに複数のTipを提供しています.
個人的に得たのは多くのプロジェクトです.
プロジェクトを完了する過程で、短時間で議論することができます.
調整の過程で苦労した私たち全員に本当に感謝します.
過去を振り返ると、
記憶に残る組み合わせ.

プロジェクト期間中にブロックされたコード:Blocker
Github : 毎日麗ホテル