美文网首页
django model ORM惰性求值

django model ORM惰性求值

作者: 人生背包客 | 来源:发表于2018-04-01 23:48 被阅读75次

    最近用 django 1.11 写点东西,由于处理的数据库部分关联比较多,目前棘手的问题是处理数据汇总部分。需求如下:

    存放根据区域进行汇总的一张表(图1)

    其中 project_id << category_id<<bigtype  ,然后每次进行汇总的时候实际上我会存在一个全局变量来说明这是第几期报表,以此避免每次汇总的时候数据库进行不必要的麻烦操作。代码示例如下:

    只取出当月创建的 record 记录,因为在前端部分我只想显示当月记录的变化

    其中 record 表为最详细的一张表,district 、category、bigtype 以及 project 在此张表中都是有描述的,并且通过外键对应到各自 model 表的主键。

    根据上图数据库部分,由于 record 表中其实在当月是存在4条记录,但是 district 实际上为2种分离,bigtype 为1种分类, category为1种分类,project为 2种分类。实际关系我通过如下图来表示:

    其实最终结果就是在 category汇总求和就行了,只要详细到category层

    目前在 django model ORM 中,本人还没有摸索到高级用法,现在遇到尴尬的地方是:

    1、能够取出当月新添加的记录,如图1所示,那么实际上 district 区域可能变动的就只有 project,但是实际遍历的时候我肯定还是要把两条记录拿出来,只要记录中有一条不同字段的记录肯定是不同的记录。

    2、1中描述就会导致实际上我会走 district 的4层遍历,仅仅是 district, 由于在汇总的时候我写了 for 循环(目前还未用 ORM 高级处理方案,还需要详细看下 Queryset API 的文档),通过在  category 层 进行记录的跟新。如此处理就会导致 实际上的写入了两次相同的最终结果,本质原因在于对于 district 的 3、4 各做了两次循环处理,实际上最终汇总应该是只落实到 category 层,前面相同的字段在汇总结果中是无关的,只是在 record 明细表中确实要区分。

    针对以上问题,有个最简单的处理方法:

    由于事先我能够把控在 record 记录中存在多少 district 字段的记录,通过去重后遍历,这个时候必须附属一个字段举例为 district_count,作为后续循环处理中 continue 的的触发值。根据 district_count 作为根据在 record 表中进行汇总的遍历次数。

    思路是以上思路,但是由于代码已经拖拉的挺长了,想组织 dict 的形式去处理,目前遇到一个 比较麻烦的问题就是 django model ORM 的惰性求值问题。

    只对最后的一个元素进行了count(),主要原因是record_list实际上填充的是QuerySet元素,只在需要处理的时候才会去真正的处理

    目前这部分在我自己的业务处理层面上是个bug,今天本来打算搞完休息的。。。已经一天耳鸣,轰轰的不行了,不过还是想坚持把这篇博文写好再休息吧。

    后期解决了这个问题,我再继续补充(未完待续。。。。。。。。。。)

    相关文章

      网友评论

          本文标题:django model ORM惰性求值

          本文链接:https://www.haomeiwen.com/subject/dtdzcftx.html