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を受信している。ただし、items
はblished
の降順で並べ変えたいのに、これではgoogle.appengine.ext.db.Queryが使えないため、itemsに.order('-blished')
ができず、
items
にappend()
した順番に取れてきてしまう。うむ・・・どうすれば非リレーショナルなDBでTwitterもどきができるのだろうか・・。
コメント
コメントを投稿