从django上的关系注释列字段

我有两个模型定义了所有者和狗

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用于除订购之外的目的.如果我遇到更好的方法,我会再次更新.

点赞