前回に続いてModelです。今回は、データの問い合わせ方法とテーブルとフィールド名のカスタマイズをやってみます。
データを問い合わせる
前回登録したデータを、Modelクラスを通して取得してみます。Djangoのシェルを起動して、次のようにします。
from app1 import models parson = models.Parson.objects.get(id=1) print parson.name
これを実行すると
>>> print parson.name new-name
と表示されます。ちゃんとデータを取得できていますよね。ちなみに JavaのO/Rマッパー HibernateだとSQLログを出力するオプションが用意されているのですが、Djangoではそれが存在していないようです。なので、DB側でSQLログを出力するようにして、デバッグすると良いと思います。
少し問い合わせについてもコードを見てみます。
parson = models.Parson.objects.get(id=1)
ここですが、Parsonクラスで定義していない objects というプロパティを使っています。このobjectsはModelクラスを継承すると暗黙的に使用でき、主にデータ問い合わせや更新などの関数を持っています。
今回使っているget関数では、単一になるようなIDを使った問い合わせで戻りが1レコードになるときに使える関数です。これに対して、検索結果画面などで一覧するような処理をするときは、filter関数を使います。使い方としては
parsons = models.Parson.objects.filter(name='new-name')
こんな感じです。parsonsはlistなので、複数のParsonインスタンスが返ってきます。それと一点、注意が必要なのは、filterで検索条件に引っかからない場合は、Noneが返ってきます。しかし、getの場合に条件が合わない場合は、例外が発生するということです。見逃しがちなので、忘れずに。
テーブル名、フィールド名をカスタマイズする
このまま、CRUD操作を説明していきたいところですが、ちょっとテーブル名が気になります。Parsonのtypoもそうですが、app1_parsonとPrefixがついてしまっています。これを直したいと思います。
Modelクラスを次のように書き換えます。
from django.db import models class Person(models.Model): name = models.TextField(db_column='name', null=False, blank=False, default='nanashi-san') address = models.TextField(db_column='address', null=False, blank=False, default='nanashi-san') class Meta: db_table = 'persons'
変更したら
python manage.py syncdb
を実行して、データベースに反映します。するとテーブルが、personsとapp1_無しで作られます。
少し解説すると、Modelクラスに Metaクラスを定義し、ここで設定情報を書いています。Hibernateだとアノテーションでやってましたが、それと意味的には同じですね。
ちなみにテーブル名は Metaクラスで設定しますが、カラム名を変更したい場合はフィールドクラスの中のdb_columnパラメータで指定します。実は元々設定が入っていますね。また、データを問い合わせるときに何気なく get(id=1)として問い合わせてしまいましたが、HibernateやRailsのActiveRecordと同様にDjangoのModelでも自動的にIDカラムが作られます。このIDカラムもカスタマイズ可能で、AutoFieldというフィールドを定義すると、IDカラムのように動作しカラム名も変更できます。