从django上的关系注释列字段
我有两个模型,分别是主人和狗从django上的关系注释列字段,django,python-2.7,django-orm,Django,Python 2.7,Django Orm,我有两个模型,分别是主人和狗 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) 我想和所有的主人列一张清单
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
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
}
任何帮助都将不胜感激
版本 ,但我对此有一些疑问,进行此查询
Dog.objects.values('owner\u name','owner','adopted\u date')。注释(Count('owner'))
我们可以得到一个很好的结果,但我担心性能,这将为值内的每一列生成一个group by,但我不需要按owner\u name
分组,因为该列不是唯一的
我在找像这样的东西
Dog.objects.values('owner', 'adopted_date').annotate(Count('owner'), Column('owner__name')).order_by()
我知道Column aggregator函数不存在,但可能是这样做的一种方法
提前感谢。如果您将查询更改为
Dog.objects.values('owner__name', 'adopted_date').annotate(Count('owner'))
您将获得所需格式的词典列表:
{
'owner__name': 'Richard',
'adopted_date': 'date',
'owner__count': 2
}
实际上,我在values()
子句的文档中找不到这一点,但在Django ORM语法中,使用双下划线(即“owner\u name”)引用查询的外键相关字段(即“owner”)的成员是很常见的
编辑 使用上述解决方案,仍然存在一个问题,即如果两只狗的领养日期相同,并且两个不同的主人同名,那么它们将被分组。如果要按狗对输出进行分组(这将确保每个组有一个所有者,因为每个狗有一个所有者),则可以在查询中的任何位置添加
。order\u by('pk')
这是可行的,但它似乎有点不切实际,因为它利用
order\u by
进行订购以外的其他用途。如果遇到更好的方法,我会再次更新。好的,没错。我现在已经知道这个解决方案是可行的,但我对此表示怀疑。所有者的名称不是唯一的,数据库应包含两个不同的Richards。这个解决方案可以将两个不同的人的结果合并为一个。也许按所有者分组也可以避免这个问题,但在这种情况下,我们使用所有者名称分组只是为了获取字段值。请看问题的版本。啊,是的,我知道你在说什么。我认为解决这个问题的方法可能是重新添加order_by,但要使用'id'作为参数。我将更新我的答案。我还删除了我的评论,即“作为旁注,您还可以删除order\u by()
子句-我认为它在没有参数的情况下不会做任何事情。”。。。我意识到了。求爱!我在学东西。好的,谢谢你的帮助。我只是在值中使用使用所有者的版本。