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しかあるまいな!!


と思って周りのメンバーに聞いてみると、
ClearSilverTracで使われているテンプレートエンジンらしい。
ClearSilverMakoも文法がキモいらしいが…


とにかくスケールしたい、でも利便性も欲しい場合にはどちらがいいかねぇ…
C言語でも使えるClearSilverをいっぺんちゃんと追ってみるか。