【问题标题】:Django use ORM to get range of a particular elementDjango 使用 ORM 获取特定元素的范围
【发布时间】:2015-05-30 18:43:25
【问题描述】:

我有一个名为 MyModel 的模型,它有一些虚拟数据如下:

     item    date     value
------------------------------
      ab    8/10/12     1
      ab    7/10/12     2
      ab    6/10/12     3
      abc   8/10/12     4
      abc   7/10/12     5
      abc   7/10/12     6
      ab    7/10/12     7
      ab    7/10/12     8
      ab    7/10/12     9
      ab    7/10/12     10
      abc   7/10/12     11
      abc   7/10/12     12
      abc   7/10/12     13

我想以这样的方式查询这个模型,我得到一个输出,给我串行项目的范围,如下所示:

[{'item': 'ab', 'values': '1-3'},
 {'item': 'abc', 'values': '4-6'},
 {'item': 'ab', 'values': '7-10'},
 {'item': 'abc', 'values': '11-13'}]

我如何使用 django ORM 做到这一点?

【问题讨论】:

    标签: django django-models django-orm


    【解决方案1】:

    很确定你不能用 ORM 做到这一点......你需要编写自己的 python 代码来做到这一点。

    counts = []
    
    for model in MyModel.objects.all().order_by('value'):
      if not counts or last_item != model.item:
        counts.append({'item': model.item, 'values': [ model.value ]})
        last_item = model.item
      elsif model.item == last_item:
        counts[-1]['values'].append(model.value)
    
    for count in counts:
      count['values'] = '%s-%s' % (count['values'][0], count['values'][-1])
    

    编辑:

    counts = []
    
    for model in MyModel.objects.all().order_by('value'):
      if not counts or last_item != model.item:
        counts.append({'item': model.item, 'first': model.value, 'last':model.value})
        last_item = model.item
      elsif model.item == last_item:
        counts[-1][last] = model.value
    

    【讨论】:

    • 整洁的解决方案..谢谢
    • 您好简单的问题.. 我应该在代码中更改什么以获得“开始”和“结束”的值?就像我想要 {"begin":1, "end":3} 而不是值列表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-26
    • 2016-01-05
    • 2018-10-02
    相关资源
    最近更新 更多