我有两个模型定义了所有者和狗
class Dog(models.Model):
name = models.CharField(max_length=255)
owner = models.ForeignKey(Owner)
adopted_date = models.DateTimeField()
class Owner(models.Model):
name = models.CharField(max_length=255)
我想列出所有业主的清单,其中包括按日期采用的狗数量.
例:
OwnerName日期金额
理查德15/11/24 2
Jow 15/11/24 2
我正在进行此查询
Dog.objects.values('owner', 'adopted_date').annotate(Count('owner')).order_by()
这里的问题是此查询返回所有者ID而不是名称.
{
'owner':1,
'adopted_date': 'date',
'owner_count': 2
}
我需要告诉拥有者所有者的名字,例如.
{
'owner':'Richard,
'adopted_date': 'date',
'owner_count': 2
}
任何帮助将不胜感激.
版
This solution works,但我对它有一些疑问,使这个查询Dog.objects.values(‘owner__name’,’owner’,’adoption_date’).annotate(Count(‘owner’))
我们可以得到一个好的结果,但我担心性能,这将为每个列内部值生成一个group by,但我不需要按owner_name分组,因为该列不是唯一的.
我正在寻找类似的东西
Dog.objects.values('owner', 'adopted_date').annotate(Count('owner'), Column('owner__name')).order_by()
我知道Column聚合器函数不存在,但也许是这样做的方法.
提前致谢.
最佳答案 如果您将查询更改为
Dog.objects.values('owner__name', 'adopted_date').annotate(Count('owner'))
您将获得所需表单的词典列表:
{
'owner__name': 'Richard',
'adopted_date': 'date',
'owner__count': 2
}
我实际上在values()子句的文档中找不到这个,但是在Django ORM语法中通常使用双下划线来引用查询的外键相关字段的成员(即“所有者”) (即“owner__name”).
编辑
通过上述解决方案,仍然存在如下问题:如果两只狗具有相同的采用日期和两个具有相同名称的不同所有者,则它们将被分组.如果你想通过dog对输出进行分组(这将确保每个组一个所有者,因为每只狗有一个所有者),那么在查询中的任何地方都可以添加.order_by(‘pk’).
这是有效的,但它似乎是hackish,因为它利用order_by用于除订购之外的目的.如果我遇到更好的方法,我会再次更新.