BigTableで悩む

GAEでTwitterライクなアプリを作ってるんだけど、BigTableのリレーションで悩んでる。モデルは以下のようにした。ちなみにZipped Django 1.0 on GAE with Helperをベースにしている。


# models.py
class User(BaseModel):
  user = db.UserProperty(required=True)
  follow = db.ListProperty(db.Key) # User model
  send = db.ListProperty(db.Key) # Item model 送信したItem
  receive = db.ListProperty(db.Key) #Item model 受信したItem
class class Item(BaseModel):
  text = db.StringProperty(required=True) # 送信したtxt
  published = db.DateTimeProperty(required=True, auto_now_add=True) # 送信したtxt

上記モデルから、"自分がFollowしたUserの全てのItem+自分が受信したItem"、"自分が受信したItem"、"自分が送信したItem"を(Twitterみたいにw)取得したい。そこで以下のように抽出する。


# views.py
def received (request): # 自分が受信したItem
  user = User.all().filter('user =',users.get_current_user())
  items = Item.get(profile.receive)

def sent (request): # 自分が送信したItem
  user = User.all().filter('user =',users.get_current_user())
  items = Item.get(profile.send)

def home (request): # 自分がFollowしたUserの全てのItem+自分が受信したItem
  user = User.all().filter('user =',users.get_current_user())
  itemkeys = profile.receive
  for (follow in profile.follow):
    user = User.get(follow)
    itemkeys.append(user.send)
  items = Item.get(itemkeys)

というかんじでItemを受信している。ただし、itemsblishedの降順で並べ変えたいのに、これではgoogle.appengine.ext.db.Queryが使えないため、itemsに.order('-blished')ができず、itemsappend()した順番に取れてきてしまう。うむ・・・どうすれば非リレーショナルなDBでTwitterもどきができるのだろうか・・。

コメント

このブログの人気の投稿

Python から Win32 API 経由で印刷する

財務諸表 (Financial Statements)

Netflix のスケール - オートメーション編