Django相交计数注释以进行排序

时间:2018-07-24 17:38:58

标签: python sql django django-models django-queryset

在此question中,我们给出了一种基于两个多对多字段的交集对查询进行排序的解决方案。虽然这是一个很好的答案,但限制是您必须先进行过滤。

说我有两个相同的模型。有没有一种方法可以通过相交计数来注释所有结果,以便我可以显示所有问题,而无论位置如何,但仍按位置排序?

class Location(models.Model):
    name = models.CharField(max_length=100)


class Profile(models.Model):
    locations_of_interest = models.ManyToManyField(Location)


class Question(models.Model):
    locations = models.ManyToManyField(Location)

我希望我可以做这样的事情:

from django.db.models import Count

matching_profiles = Profile.objects.all().annotate(
    locnom=Count('locations_of_interest__in=question.locations.all()')
)

有什么想法吗?我是否只需要进行两个查询并将它们合并?

2 个答案:

答案 0 :(得分:2)

我们也可以在Count函数中移动过滤条件:

Profile.objects.annotate(
    locnom=Count('id', filter=Q(locations_of_interest__in=question.locations.all()))
)

Profile no 相关的Location或{{1} }没有位置,仍然会包含在内,在这种情况下,该question的{​​{1}}将是.locnom

查询大致类似于:

Profile

0在这里{em> {}的相关SELECT profile.*, COUNT(CASE WHEN proloc.location_id IN (1, 4, 5) THEN profile.id ELSE NULL) AS locnom FROM profile LEFT OUTER JOIN profile_locations_of_interest AS proloc ON profile.id = proloc.profile_id GROUP BY profile.id 的{​​em> sample [1, 4, 5]

答案 1 :(得分:0)

尝试使用子查询https://docs.djangoproject.com/fr/2.0/ref/models/expressions/#subquery-expressions

就像这个例子:https://books.agiliq.com/projects/django-orm-cookbook/en/latest/subquery.html

from django.db.models import Subquery
users = User.objects.all()
UserParent.objects.filter(user_id__in=Subquery(users.values('id')))