每列django数

时间:2017-11-16 15:50:14

标签: python django django-models django-orm

我有像这样的ORM

test('should render ExpenseList with expenses', () => {
  const wrapper = shallow(<ExpenseList.wrappedComponent 
  RootStore = {
    {
      ExpensesStore: {
        expenses
      },
      FiltersStore: {
        filters: {
          text: 'e',
          sortBy: 'date',
          startDate: '',
          endDate: ''
        }
      }
    }
  } 
  />)
  expect(wrapper).toMatchSnapshot();
})

想象一下,我有以下条目

from django.db import models,

class MyObject(models.Model):

   class Meta:
       db_table = 'myobject'

   id = models.IntegerField(primary_key=True)
   name = models.CharField(max_length=48)                                        
   status = models.CharField(max_length=48)                          

我为了获得一个类似下面的查询集而必须进行的django ORM查询是什么

1 | foo | completed
2 | foo | completed
3 | bar | completed
4 | foo | failed

我从以下开始,但我不知道如何合并&#34;两列:

[{'name': 'foo', 'status_count': 'completed: 2, failed: 1'},
 {'name': 'bar', 'status_count': 'completed: 1'}]

所有这一切的目标是获得一个表格,我可以显示如下内容:

from django.db.models import Count
models.MyObject.objects.values(
    'name',
    'status'
).annotate(my_count=Count('id'))

2 个答案:

答案 0 :(得分:3)

这应该按预期工作:

test = MyObject.objects.values('name').annotate(
    total_completed=Count(
        Case(
            When(
                status='completed', then=1), output_field=DecimalField()
        )
    ),
    total_failed=Count(
        Case(
            When(status='failed', then=1), output_field=DecimalField()
        )
    )
)

答案 1 :(得分:0)

你需要包含一个&#34; order_by&#34;在查询结束时将类似项目组合在一起。

这样的事情应该有效:

from django.db.models import Count
models.MyObject.objects.values(
    'name',
    'status'
).annotate(my_count=Count('id')).order_by()

有关详细信息,请参阅https://docs.djangoproject.com/en/1.11/topics/db/aggregation/#interaction-with-default-ordering-or-order-by

编辑:对不起,我知道这并没有回答关于合并列的问题......我不认为你可以在一个查询中实际完成它,尽管你可以循环查看结果非常容易,并使您的输出表。