使用谷歌应用引擎,我使用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)
答案 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”]。