如何找到外键对象的名称和计数?

7 浏览
0 Comments

如何找到外键对象的名称和计数?

有以下这些模型:

class AccidentJob(models.Model):
    name = models.CharField(max_length=50)
class Accident(TimeStampedModel, models.Model):
    job = models.ForeignKey(AccidentJob, on_delete=models.CASCADE)

我想要的结果是这样的:

[
    {'job__name': 'Auxiliar de surtido', 'count': 2},
    {'job__name': 'Técnico de mantenimiento', 'count': 1}
]

但是我得到的结果是这样的:

[
    {'job__name': 'Auxiliar de surtido', 'count': 1},
    {'job__name': 'Auxiliar de surtido', 'count': 1},
    {'job__name': 'Técnico de mantenimiento', 'count': 1}
]

这是我的查询语句:

from django.db.models import Count
Accident.objects.values(
    "job__name"
).annotate(
    count=Count('job__name')
).values("job__name", "count")

我可以用Python解决这个问题,但我更希望让PostgreSQL来处理。

0
0 Comments

问题的出现原因是:用户想要找到一个外键对象的名称以及其数量。

解决方法如下:

首先,我们可以使用以下代码来实现这个目标:

Accident.objects.values(
    "job__name"
).annotate(
    count=Count('job__name')
).values(
    "job__name", "count"
).order_by(
    "job__name"
)

上述代码使用了`values()`方法来获取外键对象的名称,并使用`annotate()`方法来计算外键对象的数量。然后,使用`values()`方法来指定要返回的字段,包括外键对象的名称和数量,并使用`order_by()`方法按照外键对象的名称进行排序。

然而,经过一些调整后,我们可以得到一个更好的版本:

Accident.objects.values(
    "job__name"
).order_by(
    "job__name"
).annotate(
    count=Count('job__name')
)

上述代码的改进之处在于将`order_by()`方法放在了`values()`方法之后,并且在`annotate()`方法之前。这样可以更清晰地表达代码的逻辑,并且可以更好地组织查询语句。

通过以上的代码,我们可以找到外键对象的名称以及其数量,并按照名称进行排序。这样就解决了用户的需求。

0