如何在ndb中重复的字符串属性上查询列表对象

时间:2014-05-29 15:45:33

标签: google-app-engine app-engine-ndb

使用谷歌应用引擎,我使用ndb来管理我的数据。 我有一个实体使用重复的字符串属性来保存字符串值列表。 如何使用等于属性值的列表对象进行查询?

我的意思是,实体是

class Question(ndb.Model):
    question = ndb.StringProperty(required=True)
    choices = ndb.StringProperty(repeated=True)

我希望像这样查询:

question = "The question"
choices = ["Choice1", "Choice2", ..., "Choice6"]
Question.query(Question.question==question, Question.choices==choices)

1 个答案:

答案 0 :(得分:2)

如果您有重复的属性,则无法执行查询以搜索该列表的完全相等。

例如,一个Question实体:

question = "A question"
choices = ["A", "B", "C"]

将匹配以下查询的所有

Question.query(Question.choices=="A")
Question.query(Question.choices=="B")
Question.query(Question.choices=="C")

解决方案1:计算属性

如果要编写整个列表相等的查询,可以使用计算属性,该属性是重复属性的字符串化版本:

class Question(ndb.Model):
    question = ndb.StringProperty(required=True)
    choices = ndb.StringProperty(repeated=True)
    choices_list = ndb.ComputedProperty(lambda self: return ",".join(self.choices))

然后使用choices_list

进行查询
choices = [...]
Question.query(Question.choices_list==",".join(choices))

当然,只有在choices完全匹配(包括订单)时才会匹配。


解决方案2:使用AND

您还可以使用AND查询:

choices = [...]
Questions.query(
                ndb.AND(Question.choices==choices[0],
                ....,
                Question.choices==choices[n])) # Do this in a programmatic way

此解决方案具有以下优势:列表的排序无关紧要,但可能会导致误报,因为[“A”,“B”]的查询将匹配具有选项的实体[“A”, “B”,“C”]。