【问题标题】:Group by the parent in NDB query在 NDB 查询中按父级分组
【发布时间】:2013-11-04 15:10:17
【问题描述】:

假设我有一个包含学校、班级、学生模型的模型。 在这个模型中,班级是学校的孩子,学生是班级的孩子。我想要的是让所有学生按班级分组。

使用 NDB,我可以通过以下方式为学校 A 呼叫学生:

school_key = ndb.Key( 'School', 'A' )
all_students_in_A = Student.query( ancestor = school_key ).fetch( )

但是,我想按班级让 A 组中的学生。查看文档,查询接受 group_by 参数,但仅适用于模型的实际字段。

【问题讨论】:

  • 我知道这不是您问题的答案,但我觉得我应该提出来。我不一定会让学生成为班级的孩子->学校。这是一个非常刚性的结构。当学生改变班级时会发生什么。学生的密钥必须改变(它不能)所以知道你必须创建一个新的学生实体来代表新班级中的学生。学生应该是学校的孩子(除非您希望学生在学校之间移动)学生应该有班级的注册记录或类似的记录。
  • 谢谢@Tim。你是对的。然而,学校/班级/学生只是一个例子。我的实际产品是一家建筑公司网站,其中我有公司/项目/图像层次结构,更静态。
  • 这里需要注意的是group_by类似于SQL的group by。主要目的是用于聚合(在数据存储的情况下,支持 SELECT DISTINCT)。如果你只是想让它们彼此相邻排列,你可以按 __key__ 排序。由于密钥是 /ancestor1key/ancestor2key/key,每个班级的所有学生将彼此相邻排列。但是,要真正将它们分组,您仍然需要进行后期处理。

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


【解决方案1】:

我一直在使用 itertools 中的 python groupby 函数来发布进程和分组实体。

您的选择需要按要求的顺序排序,在您的情况下,您的父母在关键中。

这种方法将保持顺序。

http://docs.python.org/2/library/itertools.html#itertools.groupby

我拥有的代码不容易共享,因为我拥有的分组功能是存储/可授权查询实体的一部分,它允许按结果项的多个属性进行分组,并且实现分布在许多方法中。但是,如果您想看一些代码,请大声喊出来。

【讨论】:

    【解决方案2】:

    我会在获取学生后在 Python 中进行分组。

    classes = defaultdict(list)
    for student in all_students_in_A:
        class = student.key.id()
        classes[class].append(student)
    

    现在 classes 是一个字典,其中键是班级 ID,值是学生列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-20
      • 2022-01-09
      • 2014-10-08
      • 2020-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多