如何找到外键对象的名称和计数?
如何找到外键对象的名称和计数?
有以下这些模型:
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来处理。
问题的出现原因是:用户想要找到一个外键对象的名称以及其数量。
解决方法如下:
首先,我们可以使用以下代码来实现这个目标:
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()`方法之前。这样可以更清晰地表达代码的逻辑,并且可以更好地组织查询语句。
通过以上的代码,我们可以找到外键对象的名称以及其数量,并按照名称进行排序。这样就解决了用户的需求。