django - 从 django 上的关系注释列字段

标签 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)

我想与所有业主一起列出按日期收养的狗的数量。

例子:
所有者姓名 日期 金额
理查德 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/

相关文章:

python - 将标题插入 Django 表单

python - Django based on PostGreSql error while executing python manage.py runserver- "raise ImproperlyConfigured("Error loading psycopg2 module : %s"% e)"

python - 在 Django Rest api 中,当互联网连接速度较慢时更新数据

python - 如何获取图像文件?在Python中? Django 休息框架

python - 如何在python中实现trie的remove功能?

mysql - 带有 'in' 查找的 Django CASE

django - Django中的反向查询集顺序

python - 从 Django 的 raw() 查询函数中获取结果数

Python/PyQt4 : How to make a QComboBox Item draggable

python - 如何向客户端发送服务器响应? (Python 套接字)