我有两个模型定义了所有者和狗
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)
我想与所有业主一起列出按日期收养的狗的数量。
例子:
所有者姓名 日期 金额
理查德 15/11/24 2
24 年 11 月 15 日 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', 'adopted_date').annotate(Count('owner'))
我们可以得到一个很好的结果,但我担心性能,这将为值中的每一列生成一个 group by,但我不需要 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”)来引用查询的外键相关字段的成员(即“owner”)是很常见的。编辑
用上面的解决方案,仍然存在如果两只狗的领养日期相同,并且两个不同的主人同名,它们会被归为一组的问题。如果您想按狗对输出进行分组(这将确保每个组有一个主人,因为每只狗有一个主人),那么您可以在查询中的任何位置添加
.order_by('pk')
.这有效,但由于它使用了
order_by
,所以它看起来很黑。用于订购以外的目的。如果我遇到更好的方法,我会再次更新。
关于django - 从 django 上的关系注释列字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30948713/