从 django 上的关系注释列字段

Annotate a column field from relation on django

我有两个模型定义了 Owner 和 Dog

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 周 15/11/24 2

我正在查询

Dog.objects.values('owner', 'adopted_date').annotate(Count('owner')).order_by()

这里的问题是这个查询 return 所有者 id 不是名字。

{
    'owner':1,
    'adopted_date': 'date',
    'owner_count': 2
}

我需要在所有者上获取所有者的姓名,例如。

{
    'owner':'Richard,
    'adopted_date': 'date',
    'owner_count': 2
}

任何帮助将不胜感激。


版本

,但我对此有一些疑问,所以提出了这个查询 Dog.objects.values('owner__name', 'owner', 'adopted_date').annotate(Count('owner'))

我们可以得到一个很好的结果,但我担心性能,这将为值内的每一列生成一个分组依据,但我不需要分组依据 owner_name,因为该列不是独一无二。

我正在寻找类似

的东西
Dog.objects.values('owner', 'adopted_date').annotate(Count('owner'), Column('owner__name')).order_by()

我知道列聚合器函数不存在,但也许是一种执行此类操作的方法。

提前致谢。

如果您将查询更改为

Dog.objects.values('owner__name', 'adopted_date').annotate(Count('owner'))

您将获得所需形式的词典列表:

{
    'owner__name': 'Richard',
    'adopted_date': 'date',
    'owner__count': 2
}

我实际上在 values() 子句的文档中找不到这个,但是在 Django ORM 语法中引用查询的外键相关字段的成员是很常见的(即 "owner") 通过使用双下划线(即 "owner__name")。


编辑

采用上述方案,仍然存在如果两只狗的收养日期相同,并且两个不同的主人同名,它们会被分组的问题。如果你想按狗对输出进行分组(这将确保每组一个主人,因为每只狗有一个主人)那么你可以在查询的任何地方添加 .order_by('pk').

这行得通,但看起来有点老套,因为它利用 order_by 来达到订购以外的目的。如果我遇到更好的方法,我会再次更新。