DjangoのQを使ってTwitterのタイムラインっぽいもの

現在このブログは中途半端に移行されていますので、画像が表示されなかったり、レイアウトが崩れたりする可能性があります。
この記事を旧ブログで閲覧するには、以下のURLからご覧ください。
http://blog2.monospace.jp/2008/01/31/django_q_twitter_timeline/

前回はManyToManyを使ってFollowingとFollowersあたりを作ったんですが、 今度は、マイページのタイムラインを作ってみようかと思います。 マイページのタイムラインっていうのは、自分がFollowしてる人の発言と自分の発言を一緒に並べて表示するものです。 で、前回Followingを実装したので、 [python]user.get_profile().contacts.all()[/python] で自分(ここではuserは自分を表します)がFollowしてる人たちがとれました。 今度はPostという発言を管理しているクラスがあるので、照らし合わせて必要なPostだけを抽出しないといけません。 まず、Postクラスはこんな感じ。 [python] class Post(models.Model): user = models.ForeignKey(User) message = models.CharField(u'ひとりごと', max_length=150) posted_at = models.DateTimeField(default=datetime.datetime.now()) [/python] Userクラスへのリレーションとメッセージと投稿時間があるシンプルなクラスです。 とりあえず考えつくのは、Post.objects.all()で全部データ持ってきてそっからFollowしてる人のだけを抜き出す っていうことなんですけど、データが1億件あったり100万人Followしてたりすると困るので、 効率のよさそうなことを考えたいものです。
Q オブジェクトを使った複雑な照合 filter() などで複数のキーワード引数を指定してクエリを行うと、各々のキーワード引数の表す照合条件は違いに "AND" で結ばれます。より複雑なクエリ (例えば OR を使ったクエリ) を実行する必要がある場合には Q オブジェクトを使えます。
ということなんですが、こんな感じで使ってみました。 [python] from django.db.models.query import Q contacts = user.get_profile().contacts.all() # 自分がFollowしてる人たちを取り出す query = Q(user=user) # まずは自分が入っているという条件を入れる for contact in contacts: # Followしてる人たちを一人ずつ条件に追加 query |= Q(user=contact.user) # 「|=」って初めて使った Post.objects.filter(query)[:100] # Followしている人たちでしぼったPostを100件取得 [/python] こんな感じで動いてます。でも100万人いなくても1000人くらいFollowしてたらきついよなー。 大規模開発経験とかないにわかプログラマなのでこういうあたりが大変弱いです。
Posted at: 
2008/01/31 02:14:38
0 Comments
0 TrackBacks
Tags: 
Trackback: 
http://blog.monospace.jp/2008/01/31/django_q_twitter_timeline/trackback/

TrackBacks

まだ登録されていません。

Comments

まだ登録されていません。

Add Comment

Add Comment