假设我有这个非常简单的父母/子女关系(任何Answer
班级实例总是有Question
父母):
class Answer(ndb.Model):
content = ndb.StringProperty()
timestamp = ndb.DateTimeProperty()
def to_message():
"""Returns a protoRPC message object of the answer"""
class Question(ndb.Model):
content = ndb.StringProperty()
answers = ndb.KeyProperty(repeated = True, kind = 'Answer')
def to_message(self):
"""Returns a protoRPC message object of the question"""
两个to message
方法仅用于返回protoRPC对象。
问题是:在我的to_message
方法中,在Question
类中,如果我想获取所有子Answer
个实例,请检索它们,并使用自己的to_message
方法把它们变成一个很好的rpc消息,它是否更好:
anwers
重复的KeyProperty列表就NDB访问而言,第一种方法似乎是最好的,但由于我们无论如何都要超过免费限制,我更想知道数据存储区在获取内容方面是否比我更有效率,遍历该列表。
编辑:原始问题实际上是一个非常简单明了的答案:第一种方式。
真正的问题是,如果我必须根据其属性过滤掉一些Answer
实体(例如timestamp
):使用过滤器进行查询是否更好,或者在列表上进行迭代并使用只收集“有趣”实体的条件?
答案 0 :(得分:4)
使用该架构,您不必查询任何内容,因为您已将每个答案的键作为question_entity.answers
所以你只需要使用那些键来获取答案。如果只通过一次操作得到所有答案,那就更好了。
list_of_answers = ndb.get_multi(question_entity.answers)
(NDB Entities and Keys更多信息)
另一方面,如果您使用KeyProperty
中的Answer
建模该关系:
class Answer(ndb.Model):
question = ndb.KeyProperty(Question)
content = ndb.StringProperty()
timestamp = ndb.DateTimeProperty()
def to_message():
"""Returns a protoRPC message object of the answer"""
或与祖先:
answer = Answer(parent=question_entity.key)
在这些情况下,您应该使用普通查询来检索答案:
answers = Answer.query(Answer.question == question_entity.key)
或祖先查询:
answers = Answer.query(ancestor = question_entity.key)
分别
这意味着两个作业:查询索引加获取数据存储区。总之,在这种情况下,第一种方法检索数据存储数据的成本更低。
答案 1 :(得分:2)
在密钥列表上使用ndb.get_multi
来获取答案,然后迭代调用他们的to_message方法将是最有效的。