今考えればModelを使わないからといって、Djangoの作りの考え方自体は変わらないのは分かるし、ダメそうなら自作すれば良いと言われればそれはそうなんだけど、何にも知らない状態だと意外ときつい。
いたるところでmodelありきでの手順で書かれているもんだから、どこまでが必須でどこからが任意でやれるのかがイマイチ把握できていなかった。
modelって使わなきゃいけないのかい??
って思っていた。
そもそもmodelを使わない状況なんてあるのかよと。そもそもDjangoとかフレームワークすら使う必要ないだろうと。そうかもしれないそうかもしれない。でもDjangoを使いたかったんです。特別な理由はないけど。
全体像を把握するためにチュートリアルを流してやってみた感じ、確かにmodelを使うとかなり楽。余計なことを考えなくて良いしコード量もだいぶ減る。もし通常のデータを登録したり取り出したりなんていった機能を実装するなら確実にmodelを使った方が良い。
今回は日本語Wordnetを使用した関係で、dbファイルがすでにある状態。そこからただただデータを取り出す、これだけできれば良かった。言ってしまえばmodelを書かなければ良いだけなんだけど、ただ 何を切り捨てるか、これを見極める必要がある。
ということで今回はmodelを使わないでDBから取り出すだけの部分を。
models.py
要らない。
僕の場合は、
$ manage.py startapp xxx
でアプリを作ったので、ファイル自体は存在しているけど、何にもいじっていない。そして、models.pyをいじらないということは、おそらく次に出てくるであろう
$ python manage.py migrate
これも要らない。”データベーステーブルを自動で作ってくれるコマンドラインユーティリティ” とのことだけど、モデルを使わないのであれば必要なし。でも、Djangoのドキュメントで当然のごとく実行するような感じで書かれていたから勝手に迷走状態に突入した。
views.pyとtemplate
Djangoのチュートリアルを見ると、DjangoのデータベースAPIを使ってデータを取ってこれると記載がある。
from django.http import HttpResponse from .models import Question def index(request): latest_question_list = Question.objects.order_by('-pub_date')[:5] output = ', '.join([q.question_text for q in latest_question_list]) return HttpResponse(output)
この中の、
Question.objects.order_by('-pub_date')[:5]
これ。SQLを自分で書かなくても、条件つけて好きなだけ取って来れますと。
でも、モデルを使わない場合は、もちろん.modelsのインポートはいらないし、latest_question_list にローカルのDBでselectした結果を入れたら良い。僕は別途関数作って結果を入れてtemplateに返すようにした。
と、書きながら思ったけど、dbファイルがすでにあろうとmodelは使えるし、ということはもっと簡単に書けるんじゃないか、と今更気付く。試してないから分からないけど。
form.py
僕の場合、最終的にformを使わなくなったので、断然Djangoの恩恵を受けていないという状況に陥っている僕。最初にformを使おうと思った時に、またmodelが出てきやがった。使い方をDjangoドキュメントから一部引用すると、
from django.forms import ModelForm class Author(models.Model): name = models.CharField(max_length=100) …
と、こんな感じでmodels.Modelを継承している。
使わない場合はform.py自体いじらなくて良いんだけど、modelは使わないけどformは使いたい場合、
from django import froms class Author(forms.Form): name = models.CharField(max_length=100) …
と、普通のフォームを継承すればOK。models.Modelが合いそうならそちらを使う方がおそらくコード量は少なくなる。
ということで
何を取っ払ってしまって良いのかがイマイチよくわかっていなかったから苦労したけども、分かってしまえば大したことはない。恩恵はあまりないけど。
Django側で色々連動してやってくれる分、viewもmodelもtemplateもformも、全部Djangoが用意してくれるやつを使えるのであれば、相当楽。
コメント