Saturday, March 07, 2009

Django: objects.get_or_create()

DjangoのModelを最近使っている。Modelでunique属性を有効にした場合、同じ属性を持つレコードをsave()するとIntegrityErrorが帰ってくるので、これまではこれをキャッチしてobjects.get()を実行し、最終的にインスタンスを取得していた。しかし、これだと一つのレコードで4,5行位は使ってしまう。

いろいろ調べてみると、objects.get_or_create()という関数があり、これはレコードが存在していれば取得し、無ければ作成する、というもの。これだと1行で簡単に上に書いた処理を実行することができる。

Django本のP.142のサンプルでは、この関数の戻り値が1つ(インスタンス)という記述になっているが、その後(インスタンス、レコード作成のTrue/False)という2つの戻り値に変更になっているようだ。

Djangoはすばらしいのだが、ネットや書籍の情報を見るときには、1.0対応かどうかを意識する必要がある。

No comments: