BMOのSpotlightプラグイン作った | Top | SilverLightのムック?

 

ManyToMany?

monologistaがオープンソース化されようとしています。

monologistaは、昨年の5月にpateoさんが作って運用しているつぶやき系のwebアプリケーションです。pateoさんはプログラムも書きますが、本職はデザイナさんなのでデザインも素敵です。

Djangoのtrunkで動くようにしてからオープンソース化するとのことで、Djangoのサンプルとしても、社内とかで使うつぶやきWebアプリとしても、期待大なのです。


今、コードを直しつつブログでノウハウを公開されているところですが、丁度拙作のTrackaでも気になっているタイムライン(自分と、自分がフォローしている人の投稿が一覧されるもの)部分について言及されていたので、少し考えてみました。


pateoさんは、タイムラインの生成にQオブジェクトを使って OR を組み立てているようです。
実のところ、SQLには文字列の長さ制限がありますので、大量にORをつなぐと実行時にエラーとなってしまいます。と、いいながら現在Trackaも IN を使っているだけなので微妙に長さが伸びに勢いがないだけで同様の問題を抱えています。


friends = Friend.objects.filter(me__exact=request.user.id).select_related()
friends_id = [f.favorit_id for f in friends] + [request.user.id] #手抜き
Track.objects.filter(tracker__id__in=friends_id).order_by('-created')


Trackaでは、あえてManyToManyFieldを使用せずにUserに対してForeignKeyを二つもったモデルを定義しています。DjangoではManyToManyの関連で利用される中間テーブルはPythonコード側から見えないため、ゴリゴリやりたいときのためにそうしています。

実際のところ、Trackaの場合はこんな感じにすればフォローしている人の数に関わりなく同じSQLになります(まだ検証していないけど…meじゃなくってfavoriteかも…)。


Track.objects.filter(Q(tracker__id=request.user.id) | Q(tracker__friend__me=request.user.id)).order_by('-created')
#trackerはTrack(Postみたいの)を投稿したユーザ
#friendはフォロー関係を表す中間テーブル
#meは中間テーブルでフォローしているユーザ(つまり自分)

大規模になると話は変わってくると思いますが、ある程度まではこの位の気の使い方でいいんじゃないかと思います。

Taged with:,,,

Entry Date:2008-02-01 00:12

Author:makoto

ping url:http://www.everes.net/2008/feb/01/django-manytomany/tbping/

subscribe:feed with LDR

Comments

1 by pateo

13:38 on

2008-02-03

言及していただきありがとうございます。
恥ずかしながらSQLの文字列の長さ制限を知りませんでしたorz
ユーザを大量に作ったりしていろいろ試してみますー。

Trackbacks

1 by 常山日記

03:23 on

2008-02-02

[Python][Django]モデルフィールドのデフォルト値 ManyToMany? twitterの発言を表示する「ちんまったー」をリリースしました [MacOSX][Python][Django] MacOSXでchm Dynamic URLs in Django wysiwyg - markdown editor In memory of chicagocrime.org Goodbye, ChicagoCrim

Add Comment

コメント追加









follow everes at http://twitter.com
What's Next
Tags
Blog Archive
Project
  • » WorkStyle

    作り直し中なので、見ないでっ!

  • » pymagnolia

    ma.gnolia.comのAPIを操作するPythonライブラリ。

  • » django-ja

    Djangoと日本の仲間たち。
    Djangoに関するニュースや、「仲間たち」のブログエントリをアグリゲートしています。

  • » rhaco

    PHPのWebフレームワーク。 PHPらしさを失わず直感的に記述できることを目指している。 Djangoと同じく、他のライブラリに依存しない。また、Djangoっぽいテンプレートの作り方も可能。

  • » Tracka

    スモールチーム、家族用の知共有ウェブアプリケーション。
    テキスト、画像、youtube動画、stage6動画等をトラック!

  • » BMO

    BMOは、本、CD、DVD、ゲームに印刷されているバーコードをiSightで読み取り、AmazonのAPIを利用して画像や情報をmacに保存します。iSightのついているmacで利用してください。Leopardと呼ばれているOSX 10.5以上が必要です。 保存した情報は、OSX Leopard(10.5)から搭載されたCover FlowとQuick Lookという仕組みを利用して表示します。