>>> from game.models import * >>> hts = HeroTemplate.all() >>> ht = hts.fetch(1)[0] >>> ht.template_name #問題なし >>> ht.name #問題なし >>> hero = Hero( ... name=ht.name, ... symbol=ht.symbol, ... max_life=ht.max_life, ... life=ht.max_life, ... max_move=ht.max_move, ... move=ht.max_move, ... weapon=None, ... item=None, ... ) >>> hero #ここでUnicodeEncodeError >>> ht.createHero() #上記と同じ処理をやるメソッド、これもUnicodeEncodeError原因を調べていてわかったのですが、Python 2.5系列では__repr__()がunicodeを返すようにしてしまうとトラブルの元になってしまうようです。
参考にしたサイト:
http://d.hatena.ne.jp/alisue/20090402/1238690818
たとえば、
>>> class Abesi: ... def __repr__(self): ... return u'¥u3059¥u305a¥u304d¥u3044¥u3061¥u308d¥u30fc' ... >>> abesi = Abesi() >>> abesi #UnicodeEncodeErrorこれを実行するとabesiを表示しようとしたタイミングでエラーになります。環境はWindowsXP上のCygwin 1.7 + Python 2.5.4で、ターミナル上ではshift_jisを使っています。始めっからターミナルがutf-8を扱えるような環境なら__repr__()でunicodeを返しても上手くいくかもしれません。
しかしながらどこの環境でも動くとはいいがたい状態なので、
- __str__()と__repr__()はstrを返す
- __unicode__()はunicodeを返す
■っていうかそもそも
Djangoのdjango.db.models.Modelクラスは特にオーバーライドしなくても綺麗な__repr__()を出力してくれるので、デフォルトの__repr__()を使えばよかった><