python - 使用子查询注释计数

标签 python django django-aggregation django-annotate django-subquery

请帮帮我,我已经坚持了太久了:(

我想做什么:

我有这两个模型:

class Specialization(models.Model):
    name = models.CharField("name", max_length=64)
class Doctor(models.Model):
    name = models.CharField("name", max_length=128)
    # ...
    specialization = models.ForeignKey(Specialization)

我想用拥有该专业的医生的数量来注释查询集中的所有专业。

到目前为止我的解决方案:

我经历了一个循环并做了一个简单的:Doctor.objects.filter(specialization=spec).count() 但是事实证明这太慢且效率低下。 我读得越多,就越意识到在这里使用 SubQuery 来过滤 OuterRef 特化的医生是有意义的。这是我想出的:

doctors = Doctor.objects.all().filter(specialization=OuterRef("id")) \
    .values("specialization_id") \
    .order_by()
add_doctors_count = doctors.annotate(cnt=Count("specialization_id")).values("cnt")[:1]

spec_qs_with_counts = Specialization.objects.all().annotate(
    num_applicable_doctors=Subquery(add_doctors_count, output_field=IntegerField())
)

对于每个专业,我得到的输出只有 1。该代码只是用其 specialization_id 注释每个医生对象,然后注释该组内的计数,这意味着它将是 1。

不幸的是,这对我来说并不完全有意义。在我最初的尝试中,我使用了一个聚合来进行计数,虽然它独立工作,但它不能作为 SubQuery 工作,我得到这个错误:

此查询集包含对外部查询的引用,并且只能在子查询中使用。

我之前发布过这个问题,有人建议做 Specialization.objects.annotate(count=Count("doctor"))

但是这不起作用,因为我需要计算一个特定的医生查询集。

我点击了这些链接

但是,我没有得到相同的结果:

如果您有任何问题可以更清楚地说明这一点,请告诉我。

最佳答案

问题

问题是 Django 一看到使用聚合函数就添加 GROUP BY

解决方案

因此您可以创建自己的聚合函数,但 Django 认为它不是聚合函数。就像这样:

doctors = Doctor.objects.filter(
    specialization=OuterRef("id")
).order_by().annotate(
    count=Func(F('id'), function='Count')
).values('count')

spec_qs_with_counts = Specialization.objects.annotate(
    num_applicable_doctors=Subquery(doctors)
)

有关此方法的更多详细信息,您可以在这个答案中看到:https://stackoverflow.com/a/69020732/10567223

有用的信息也可以在关于 using aggregates within a subquery expression 的文档中找到和 func expressions .

关于python - 使用子查询注释计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52027676/

相关文章:

python - 使用 tweepy 如何获得推文的收藏和转发?

python - Django 多数据库 Multi-Tenancy 与 MongoDB

django - 如何在 Django 中检索聚合查询的整数?

Django ORM,多列的总和

python - 删除比预期更多的字符

python - 如何在python中扩展一个类?

python - sqlalchemy 连接负载 : syntax to load multiple relationships more than 1 degree separated from query table?

python - Django + Apache + Windows WSGIDaemonProcess 替代方案

css - 如何在Django博客中显示CSS文件?

Django:做复杂注释和聚合的问题