在NDB上按父字段查询子表和查询的顺序结果



在我的模型中,我有两个相关的表,如下面的表:

from google.appengine.ext import ndb
class Parent(ndb.Model):
name = ndb.StringProperty()
class Child(ndb.Model):
parent = ndb.KeyProperty(kind=Parent, indexed=True)
name = ndb.StringProperty()

我想在CCD_ 1表上查询,并按父名称(升序或降序(对子记录进行排序,如何使用NDBORM完成此操作?

尽可能地,我不希望这个过程在Python的帮助下在代码级别完成

通常@gaefan是正确的,您不能正确地执行此操作。

我只能看到三种方法来实现这一点。

  1. 父名称也必须是父名称的关键字,然后您可以订购Child.query().order(Child.parent).fetch()。不利的一面是,更改父项的名称实际上是不可能的。你必须在所有Child型号和其他有外键的型号上更改其密钥和所有外键

  2. 将父名称反规范化为Child上的字段,如下所示:

    class子级(ndb.Model(:parent=ndb。KeyProperty(kind=Parent,indexed=True(name=ndb。StringProperty((parent_name=ndb。StringProperty((

然后您可以执行Child.query().order(Child.parent_name).fetch()。不利的一面是,如果你想更改Parent.name,你必须更新它的所有子项。

  1. 如果这是针对类似http处理程序的内容,并且您需要返回一个包含10个结果的页面或其他内容,则可以首先获取按名称排序的10个家长,然后对拥有其中一个家长Child.query(namespace="test").filter(Child.parent.IN(order_parent_keys)).fetch()的所有子代运行查询(这是您在评论中建议的(。你只需要按照父母的名字在事实之后给孩子们排序。这个方法的问题是,它一次只适用于有限数量的父母(我忘记了可以传递给.IN()的值有多少(。此外,当order_parent_keys的原始组的子组用完并且需要获得下一个集合时,分页也会变得奇怪

适合您的解决方案实际上取决于您的数据。你有多少父母,你希望每个父母都有多少孩子。此外,你要处理多少数据,处理速度有多快

例如,如果你需要每天处理一次你的全部或大部分数据库,谷歌数据流将是完美的选择。

最新更新