【问题标题】:Render new table with values from a differently modeled queryset使用来自不同建模查询集的值呈现新表
【发布时间】:2015-10-15 13:47:36
【问题描述】:

我正在使用 django-tables2 来显示存储在 SQLite 数据库中的数据,如下所示:

(Table1:) 
id  field1  field2  field3
1   George  green   42
2   George  blue    72
3   George  yellow  1
4   James   brown   10

现在,我想重新组织这张表,将 field2 中的值用作新列,并用 field3 中的值填充单元格:

(Table 2:)
field1  green  blue  yellow  brown
George  42     72    1
James                        10

我有两个表的 django 模型和表,理论上我可以对表 2 的模型进行硬编码(尽管动态执行此操作会更优雅,但首先要做的事情是)。

我现在的问题是:执行这种转换的最佳方式是什么?

基本思路:

queryset = Model1.objects.all()
# reorganize queryset somehow
table = Table2(queryset)

我觉得这可以以更好的方式完成。我很乐意收到任何建议!

谢谢, 菲利普

【问题讨论】:

    标签: python django sqlite view django-tables2


    【解决方案1】:

    你可以试试这个:

    from django.db.models import Sum
    
    all_items = Model1.objects.all()
    names = Model1.objects.values_list('field1', flat=True)
    name_set = set(names)
    
    items = []
    
    color_choices = ['green', 'blue', 'yellow']
    
    for name in name_set:
        name_info = {
            'field1': name,
        }
    
        for color_choice in color_choices:
            result_sum = all_items.filter(field1=name, field2=color_choice).aggregate(color_sum=Sum('field3'))
            name_info[color_choice] = result_sum['color_sum']
    
        items.append(name_info)
    
    table = Table2(items)
    

    此代码使用一组获取唯一名称,然后对于每个名称,它计算灰色、蓝色和黄色属性(计算为人的所有数量的总和,使用指定的唯一名称选择那个颜色)。所有这些信息都收集在变量项中的字典列表中,然后将其传递给 django-tables2 以进行渲染。

    然后只需配置 django-tables2 以相应地显示新数据。

    【讨论】:

    • 太棒了,非常感谢!给未来用户的小评论:Model1.objects.values(...) 应该是Model1.objects.values_list(...)。然后它就像一个魅力。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-31
    • 2021-12-17
    • 2019-11-01
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 2018-06-27
    相关资源
    最近更新 更多