请帮助我,我已经坚持了太久了:(
我想做的事:
我有这两个模型:
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。
不幸的是,这对我来说并不完全有意义。在我最初的尝试中,我使用了一个聚合来计数,虽然它本身可以工作,但它不能作为 a 工作SubQuery
,我得到了这个错误:
This queryset contains a reference to an outer query and may only be used in a subquery.
我之前发布过这个问题,有人建议这样做Specialization.objects.annotate(count=Count("doctor"))
但是,这不起作用,因为我需要计算特定的医生查询集。
我已经关注了这些链接
但是,我没有得到相同的结果:
https://docs.djangoproject.com/en/1.11/ref/models/expressions/
https://medium.com/@hansonkd/the-dramatic-benefits-of-django-subqueries-and-annotations-4195e0dafb16
如果您有任何问题可以更清楚地说明这一点,请告诉我。