如何在GAE ndb中建模唯一约束

时间:2015-08-28 04:15:14

标签: python google-app-engine unique google-cloud-datastore

我想要几个"捆绑" (Mjbundle),基本上是一堆问题(Mjquestion)。 Mjquestion有一个整数"索引"属性需要是唯一的,但它只应在包含它的包中唯一。我不确定如何正确地建模这样的东西,我尝试使用下面的结构化(重复)属性来做,但实际上没有任何东西限制Mjquestion索引的唯一性。这样做的更好/正常/正确的方法是什么?

class Mjquestion(ndb.Model):
    """This is a Mjquestion."""
    index = ndb.IntegerProperty(indexed=True, required=True)
    genre1 = ndb.IntegerProperty(indexed=False, required=True, choices=[1,2,3,4,5,6,7])
    genre2 = ndb.IntegerProperty(indexed=False, required=True, choices=[1,2,3])
    #(will add a bunch of more data properties later)

class Mjbundle(ndb.Model):
    """This is a Mjbundle."""
    mjquestions = ndb.StructuredProperty(Mjquestion, repeated=True)
    time = ndb.DateTimeProperty(auto_now_add=True)

(使用上面的模型并获取了某个Mjbundle实体,我不知道如何根据索引快速从mjquestions中获取Mjquestion。对结构化属性的过滤的解释看起来像是在Mjbundle类型级别上工作,虽然我已经有一个Mjbundle实体,并且不确定如何快速查询该实体所包含的问题,而不是通过它们全部循环#34;手动"在代码中。)

所以我愿意接受有关如何更好地做到这一点的任何建议。

  • 我读到了这个信息性的答案:https://stackoverflow.com/a/3855751/129202它提供了一些关于可伸缩性的想法,并且在相关的说明中我将期待几个捆绑但每个捆绑包将有数千个问题。

  • 也许我根本不应该使用Mjbundle的mjquestions属性,而是专注于育儿:每个创建的Mjquestion都应该有一个Mjbundle实体作为父实体。然后"手动"在"插入时间"强制执行唯一性通过做一个祖先查询。

1 个答案:

答案 0 :(得分:1)

当您使用StructuredProperty时,所有键入的实体都存储为包含实体的一部分 - 因此当您获取包时,您已经提取了所有问题。如果你坚持使用这种存储方式,迭代检查代码是解决方案。