从 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
来达到订购以外的目的。如果我遇到更好的方法,我会再次更新。
我有两个模型定义了 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
来达到订购以外的目的。如果我遇到更好的方法,我会再次更新。