爲了避免第二個查詢,您可以存儲所有用戶在單個實體投票的問題。該實體可以是用戶模型的一部分,或與用戶實體存在一對一的關係。
然後,您可以根據需要加載此信息(並將其存儲到memcache以避免數據存儲加載),以便您可以快速檢查用戶是否已經對問題投了票(大部分時間不進行第二次查詢)。
如果用戶可以對很多問題進行投票,那麼您可能不得不延長這個想法。這裏是你怎麼可能去的簡單方案的輪廓(不具有完整功能):
class UserVotes(db.Model):
# key = key_name or ID of the corresponding user entity
# if all of your question entities have IDs, then voted_on can be a list of
# integers; otherwise it can be a list of strings (key_name values)
voted_on = db.ListProperty(int, indexed=False)
# in your request handler ...
questions = ...
voted_on = memcache.get('voted-on:%s' % user_id)
if voted_on is None:
voted_on = UserVotes.get_by_id(user_id) # should do get_or_insert() instead
memcache.set(...)
for q in questions:
q.has_voted = q.key().id() in voted_on
如果voteed_on = [],而不是`coted_on:`爲真,我會用`如果voted_on是None:'替換`if not voted_on:`。 – 2010-11-23 02:35:34
好點弗拉基米爾;我調整了代碼 - 謝謝! – 2010-11-23 03:59:24