【问题标题】:Django - How to group multiple records based on multiple columnsDjango - 如何根据多列对多条记录进行分组
【发布时间】:2019-02-10 10:47:17
【问题描述】:

我是 python/django 的新手,所以请多多包涵。

我有查询集qrySet.values_list('group_id', 'date', 'time', 'mobile')

我得到这样的列表

[1, datetime.date(2018, 9, 8), datetime.time(18, 39), 'phone1']
[2, datetime.date(2018, 9, 12), datetime.time(4, 0), 'phone1']
[2, datetime.date(2018, 9, 19), datetime.time(4, 0), 'phone2']
[2, datetime.date(2018, 9, 19), datetime.time(4, 0), 'phone4']
[9, datetime.date(2018, 9, 10), datetime.time(4, 35), 'phone3']
[9, datetime.date(2018, 9, 17), datetime.time(4, 35), 'phone3']
[9, datetime.date(2018, 9, 18), datetime.time(4, 35), 'phone3']

我正在尝试将所有具有相同 group_iddatetime 的电话号码放在一起,例如 [[group_id, date, time, [phone1, phone2, phone9]]

在 Django 或 python 中是否有内置的东西来处理这种事情?

我使用lambda 尝试了一些 SO 解决方案,但它们基于一个值分组,而我有三个。

谢谢

【问题讨论】:

  • 这是一个排序问题,还是您想每部手机只记录一条记录?
  • 你的数据库是什么? Postgres 支持ArrayAgg: stackoverflow.com/questions/43203014/… 否则你最终必须做一些后期处理才能得到电话号码列表。

标签: python django


【解决方案1】:

你可以试试itertools.groupby:

from itertools import groupby

[list(key) + [[g[3] for g in group]] 
    for key, group in groupby(
        qrySet.values_list('group_id', 'date', 'time', 'mobile'), 
        key=lambda x: (x[0], x[1], x[2]))]

使用您的示例数据,可以得出:

[[1, datetime.date(2018, 9, 8), datetime.time(18, 39), ['phone1']],
 [2, datetime.date(2018, 9, 12), datetime.time(4, 0), ['phone1']],
 [2, datetime.date(2018, 9, 19), datetime.time(4, 0), ['phone2', 'phone4']],
 [9, datetime.date(2018, 9, 10), datetime.time(4, 35), ['phone3']],
 [9, datetime.date(2018, 9, 17), datetime.time(4, 35), ['phone3']],
 [9, datetime.date(2018, 9, 18), datetime.time(4, 35), ['phone3']]]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-29
    • 1970-01-01
    • 1970-01-01
    • 2017-03-30
    • 2015-08-08
    • 1970-01-01
    相关资源
    最近更新 更多