如何过滤分组的外键?
How to filter on a foreign key that is grouped?
型号:
from django.db import models
class Person(models.Model):
name = models.CharField(max_length=100)
class Result(models.Model):
person = models.ForeignKey(Person, on_delete=models.CASCADE)
outcome = models.IntegerField()
time = models.DateTimeField()
Sql:
select * from person as p
inner join (
select person_id, max(time) as max_time, outcome from result
group by person_id
) r on p.id = r.person_id
where r.result in (2, 3)
我想要获取最后结果为 2 或 3 的所有人记录。我在上面添加了原始 sql 以进一步解释。
我查看了使用子查询来过滤具有匹配结果 ID 的人员记录
sub_query = Result.objects.values("person_id").annotate(max_time=Max("time"))
但是使用值会去除其他字段。
理想情况下,我可以在一个人的查询集中执行此操作,但我认为情况并非如此。
下面的查询排除了所有标记不等于 2 或 3 的人,然后按时间降序对结果进行排序(最新的将在最前面),最后得到人的详细信息 ...
from django.db.models import Q
results = Results.objects.filter(Q(outcome=3) | Q(outcome=2)).order_by('-time').values('person')
由于一个人可能有多个结果记录,而我只想查看最后一个记录,subquery 是我能找到的唯一方法
last_result = Subquery(
Result.objects.filter(person_id=OuterRef("pk")).order_by("-time").values("result")[:1]
)
people = Person.objects.all().annotate(max_time=Max("result__time"), current_result=last_result).filter(current_result__in=[2,3)
首先,我创建了一个子查询,它将 return 最后一条结果记录。然后我将其添加为人员查询中的一个字段,以便我可以对其进行过滤以仅获得具有 2 或 3 的结果。
只有 return 个人记录当前结果是 2 或 3。
型号:
from django.db import models
class Person(models.Model):
name = models.CharField(max_length=100)
class Result(models.Model):
person = models.ForeignKey(Person, on_delete=models.CASCADE)
outcome = models.IntegerField()
time = models.DateTimeField()
Sql:
select * from person as p
inner join (
select person_id, max(time) as max_time, outcome from result
group by person_id
) r on p.id = r.person_id
where r.result in (2, 3)
我想要获取最后结果为 2 或 3 的所有人记录。我在上面添加了原始 sql 以进一步解释。
我查看了使用子查询来过滤具有匹配结果 ID 的人员记录
sub_query = Result.objects.values("person_id").annotate(max_time=Max("time"))
但是使用值会去除其他字段。
理想情况下,我可以在一个人的查询集中执行此操作,但我认为情况并非如此。
下面的查询排除了所有标记不等于 2 或 3 的人,然后按时间降序对结果进行排序(最新的将在最前面),最后得到人的详细信息 ...
from django.db.models import Q
results = Results.objects.filter(Q(outcome=3) | Q(outcome=2)).order_by('-time').values('person')
由于一个人可能有多个结果记录,而我只想查看最后一个记录,subquery 是我能找到的唯一方法
last_result = Subquery(
Result.objects.filter(person_id=OuterRef("pk")).order_by("-time").values("result")[:1]
)
people = Person.objects.all().annotate(max_time=Max("result__time"), current_result=last_result).filter(current_result__in=[2,3)
首先,我创建了一个子查询,它将 return 最后一条结果记录。然后我将其添加为人员查询中的一个字段,以便我可以对其进行过滤以仅获得具有 2 或 3 的结果。
只有 return 个人记录当前结果是 2 或 3。