PyQオフィシャルブログ

Pythonのオンライン学習プラットフォームPyQのオフィシャルブログです

PyQメンター相談会9月を開催、Djangoのモデル設計支援とプロジェクトのレビューをしました

id:hirokiky です。

Djangoで開発していて、モデル設計がうまくいかない、Djangoのプロジェクトがちゃんと書けてるか不安、 settings.py があっているか分からないという悩みは多いのではないでしょうか。

今回のPyQ メンタープラン相談会では、そういった自分でDjangoアプリを作るうえでの悩みを解決できました。

pyq.connpass.com

例えばこんな悩みです。

  • 今までのモデル設計ではうまくいかない部分がでてきたけどどうすれば?
  • Djangoで静的ファイルの配信を設定したけど、やり方はあっていそう?
  • 全体的にプロジェクトをレビューして、悪いところありそう?

たしかに単純に質問するには難しい内容も多くありますね。 全体感や設定のレビューというのも、Web上に公開するわけにはいかないので難しいと思います。

ご相談いただいた内容から一般的な内容だけでもご紹介できればと思います。

マスターデータを変更すると、履歴データにも影響してしまうけどどうすれば?

今回は、既存アプリでマスターデータを変更すると、履歴データにも影響してしまうけどどうすれば良いか?というお悩みでした。 履歴データからマスターデータへのリレーションを持って管理していたので、マスターが変わると履歴の情報(例えば商品価格)も変わってしまいます。 履歴の情報なので「その当時の」情報が必要なわけです。

解法としては、履歴側にも履歴を残した当時のマスターの情報を一部、コピーするよう提案しました。 データとしては非正規化されてしまうようですが、「履歴当時の情報」として残しています。 例えば、購入履歴モデルの購入時の商品の価格フィールドに保存しておく、などです。

それに合わせて一緒にプログラムを修正して、相談会の間に問題を解決できました。

また、既存の履歴データに非正規化したデータを入れる方法をお伝えしました。 今回はDjangoでのデータマイグレーションを使ったやり方、データマイグレーションの作り方をご説明しました。

Djangoの設定、プロジェクト全体のレビュー

あとはお客様のDjangoプロジェクトを見て、問題のある部分が無いかをレビューしました

  • レビューしてみて全体的に問題ある実装はなさそうでした
  • 静的ファイル配信に WhiteNoise を使うのも、今のアプリ的には良さそう。使い方も良さそう
    • Nginxなど考慮せず簡単に静的ファイルを配信する場合は WhiteNoise を使うと良いです
    • アクセス頻度の高くないWebアプリだったので、WSGIミドルウェアから静的ファイルを配信しても問題なしと判断しています
    • WSGIサーバーのワーカーを食わないために、Nginxからやるほうが良いです
  • Django内での静的ファイル、CSSの置き場所も良さそう
  • 継承元になるテンプレート base.html でメインになるCSSを読み込むのも良い
  • プログラムはできれば、PEP8は準拠したほうがいいと、細かい話ですが提案
    • PEP8は見た目の良さもありますが、書式を合せることで複数人で開発した際のDiffの衝突が起こりにくい利点もあります
  • myproj/urls.py は、今後大きくなって辛くなってくればアプリごとの urls.py に分割していけます、と提案しました
  • 他settingsレビュー、細かいところを指摘
    • settings.py 内で from local_settings import * として、ローカル用の設定を上書きするのであれば、ファイルの一番下に書かないと意味がありません
    • 似た設定同士はまとめて書かないと色んなとこに書いちゃって混乱してしまう(例えば STATIC_ 系ならそれでまとめて書くこと)
  • 要らないライブラリー、settingsがないか確認
    • いくつか要らないものを削除

まとめ

たしかにDjangoのプロジェクトの設定方法や、セキュリティー上問題ないか?などは疑問が残ったままになる点ですね。 色々な情報を参考にして設定していくと、 settings.pyurls.pyrequirements.txt もゴチャゴチャしてきてしまいます。 PyQのメンタープランではそういった悩みにも応えられます。

また、今の PyQ の学習カリキュラムではこの点はカバーできていないところだと思いました。 settings.py やマイグレーション、セキュリティーやデプロイについても学べるプラットフォームになれればいいなと思います。

pyq.jp