Techブログ

Tech blog

Pythonの話

LaravelからDjangoに乗り替えてハマったこと5選

カテゴリ:Pythonの話

2020.07.20

このエントリーをはてなブックマークに追加

LaravelとDjangoには多くの共通点があったりします。今回は二つのフレームワークの共通点・違いを見ていきます。

目次

比較

まず2つのWebフレームワークの比較からみていきましょう。

フレームワークLaravelDjango
概念MVCMTV
生成コマンドphp artisan *** python manage.py ***
モデルapp/[ModelName].phpmodels.py
コントローラーapp/Http/Controllers/[ControllerName]Controller.php

views.py

ビューresources/views/ControllerName]/[TemplateName].blade.php
templates/***.html
ルーティングroutes/web.php
urls.py
マイグレーションdatabase/migrations/
migration
初期データdatabase/seeds/
fixtures
API対応route/api.php などが対応
Django REST Framework(外部ライブラリ)

こちらのサイトを参考にさせていただきました。

見ての通り、フォルダ構成は違えど概念は以外と近かったりします。

1.インデントタブ

例えばECサイトで、送られたパラメーターを元にカートの中の商品をデリートする処理をコントローラーで書くと‥‥

Laravel

Django

お気づきかもしれませんがDjango(Python)には{}で囲むことをしません。Laravelではスコープは{}の範囲内ですがDjangoだと使えまえません。

Pythonではインデント幅がスコープになっています。なので今回のDjangoの処理で、returnの記述を1行でも前にずらすとdeleteの処理は効かなくなります。

2.クエリビルダとクエリセット

名前が似ていることから用途も同じように捉えている方が多いかもしれません。この二つの比較を見てみます。

Laravel

LaravelではDBから情報を取得する方法が大きく分けて2種類あります。

クエリビルダモデルを介さずに直接DBの情報を取得する方法。
例)全てのusersテーブルのデータを取得
$users = DB::table(‘users’)->get();
エロクアントモデルを介してDBデータを取得
$users = User::all();

これは私の感覚ですが、Laravelでは基本的なCRUD操作はエロクアントを使用(楽だから)。joinなどで関連のないテーブル同士の結合からデータを取得をする場合にだけクエリビルダを使用していました。

Django

Djangoにも2つの方法で取得する方法があります。

Formクラスモデルをインスタンス化し、フォームの値をバリデーションした後にCRUD操作をする
クエリセットモデルを介してCRUD操作する

ん?この二つ何が違うの?って感じじゃないですか。どちらでもいいのかというとそういう分けでなく、これも私の感覚ですがテンプレートでFormクラスを使う場合にはFormクラスを使う方が楽です。

例えばFormクラスを利用して、テンプレートからPOST通信で送られたデータを保存するとします。

Formクラス

取得方法は以下の様になります。

実はこれ、クエリセットでもできます。

クエリセット

あまり大した違いを感じられないかと思いますが、フィールドに注目してください。

Formクラスではテンプレートで入力された値を手動で入れる必要がありません。しかし、クエリセットではリクエストのデータを一々代入していく必要があります。

なので使い分けの境界線としては、

テンプレートでFormクラスを使う場合はviews.pyでもFormクラスを使用。formから値は何もなく通信が来た場合や複雑なデータ取得、DBから一覧データの取得にはクエリセットを使用する、と考えていただけたらと思います。

結論:クエリビルダもクエリセットも楽できなくなったら使う。

3.Ajaxでcsrfトークンの送り方

例えばあなたがTodoリストで最新順のタスクに並べ替える機能を実装する場合、

Laravel

Django

注目して欲しいのは4行目のURL指定と8行目のトークンの付けかたです。これらがDjango特有の組み込みタグです。

4.JSファイルの分割

Laravel

Django

Djangoだとtemplatesと同階層にstaticフォルダを作成し、その中でcssやjsファイルを呼び出します。

この方法はcssはいいのですが、jsファイルになるとurlなどの呼び出しがうまくできなくなります。

なので以下は私なりのやり方になります。

今回の例の記述だとtemplates/js/hoge_js.htmlを作成し、<script>タグで始めて書くだけです。これであくまでhtmlとしてjsファイルを読み込むことができます。

5.デバッグ

Laravelのデバッグでは特に以下のデバッグ関数が使われます

  • var_dump() :指定した式に関してその型や値を含む構造化された情報を 返します。
  • dd() :dump and dieの略。処理はここでデータを全て吐き出し、処理は止まる。
  • \DB::enableQueryLog(); :直近のエロクアント、クエリビルダの文をSQL文で出力する。dd(DB::getQueryLog());を吐き出したい処理のすぐ下に書くことでそのSQL文のみを出力してくれる。

djangoではデバッグ関数が用意されていません。よく使われるのはprint()文で出力したい変数の中身を取得します。しかし、print()文だと取得できている値を全て確認できなかったりします。その上ターミナル上で確認しにくい。

Djangoには専用のデバッグツールバーが用意されています。

まずはターミナルで以下のコマンド

次に設定

これでブラウザを開いたら右横にデバッガーツールが表示されます。

リクエストで受け取った値や「SQL」をクリックすることで実行したクエリ文を確認することができます。

おわりに

他にもたくさんはまったことがあります。MySQLの設定とか‥‥。

Webフレームワークとしての機能で比較するだけなら他に劣るところが見られますが、機械学習・AIなどのライブラリの導入はPython系のDjangoでしかできません。そこが本来のDjangoの魅力です。

また別の機会に紹介させていただこうと思います。

一覧へ戻る

記事をカテゴリから探す