2日目。
Djangoのドキュメントを読みまくる。
複数カラムでのUNIQUE制約は、
class Model(models.Model): class Meta: unique_together = (("column1", "column2"),)
う〜ん、悩む。
以下のようなモデルがある場合、
class Parent(models.Model): name = models.CharField(maxlength=128) class Child(models.Model): name = models.CharField(maxlength=128) parent = models.ForeignKey(Parent, related_name='children') class GrandChild(models.Model): name = models.CharField(maxlength=128) parent = models.ForeignKey(Child, related_name='children') class Mago(models.Model): name = models.CharField(maxlength=128) parent = models.ForeignKey(Child, related_name='magotachi')
以下のようなテンプレートで表示を行いたい。
・Parent.name
・children[0].name
・children.children[0].name
・children.children[1].name
・children.magotachi[0].name
・children.magotachi[1].name
・children.magotachi[2].name
・children[1].name
・children.magotachi[0].name
・children[2].name
・children.children[0].name
はて、どうするのがスマート&高速なんだろうか…
常山さんに、satchmoのコードが参考になるよ!と教えていただいた。
http://www.satchmoproject.com/trac/browser/satchmo/trunk/satchmo/product/models.py
階層を無限に持てるカテゴリのModelらしい。
get_all_childrenのあたりを参考にすればよさそうだ。
やはり、自前で辿ってリストを作るしかないようだ…
flattenの元ネタはここのようだ。
よくよく考えたら、ジェネレータが適するタイプの問題じゃないかな、これ。
ジェネレータで書いてみよう。
こんな感じで書いてみたけどようわからん。
class Parent(models.Model): name = models.CharField(maxlength=128) class Child(models.Model): name = models.CharField(maxlength=128) parent = models.ForeignKey(Parent, related_name='children') def children_array(self): for c in self.children.all(): yield c def magotachi_array(self): for m in self.magotachi.all(): yield m class GrandChild(models.Model): name = models.CharField(maxlength=128) parent = models.ForeignKey(Child, related_name='children') class Mago(models.Model): name = models.CharField(maxlength=128) parent = models.ForeignKey(Child, related_name='magotachi')
複雑なレンダリングについて他にも例を見たければ, {% if %} や {% for %}, {% ifequal %} , {% ifchanged %} のソースを参照してください.ソースは django/template/defaulttags.py にあります.
ということで、defaulttags.pyを読もう。うん。
…と思いつつ、メシを食って帰って瞑想していたら、
djangoを使わなくてもいいんじゃね…という結論に達した。
スレッド式掲示板はdjangoでは書きづらい、という噂も聞いたし、
ORMapperはあんまり必要じゃない感じのアプリケーションだしね。
というわけで、
- スケールするテンプレートエンジン
を探すことにしよう。
Admin画面だけ別でDjangoを素で使おう。
さかとくさんの記事を読む。
そしてまた瞑想に入る…
を読む。
うん、ClearSilverしかあるまいな!!
と思って周りのメンバーに聞いてみると、
ClearSilverはTracで使われているテンプレートエンジンらしい。
ClearSilverもMakoも文法がキモいらしいが…
とにかくスケールしたい、でも利便性も欲しい場合にはどちらがいいかねぇ…
C言語でも使えるClearSilverをいっぺんちゃんと追ってみるか。