日記

日々のことと、Python/Django/PHP/Laravel/nodejs などソフトウェア開発のことを書き綴ります

Model その2

前回に続いて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)として問い合わせてしまいましたが、HibernateRailsActiveRecordと同様にDjangoのModelでも自動的にIDカラムが作られます。このIDカラムもカスタマイズ可能で、AutoFieldというフィールドを定義すると、IDカラムのように動作しカラム名も変更できます。

まとめ

今回は、簡単なデータ問い合わせと関数の選択肢、そしてテーブル名とカラム名の変更を駆け足にやってみました。次回は、CRUDの残りの操作をやってみたいと思います。

しかし、自宅で記事を書くときには画面が大きい(物理的にも、解像度的にも)ノートPCが欲しいです。