我有以下模型,并希望对此进行过滤查询。
class Invite(models.Model):
user = models.ForeignKey(User, related_name='user_invite')
template = models.CharField(max_length=500, null=True, blank=True)
user_time = models.TimeField(blank=True, null=True)
user_date = models.DateField(blank=True, null=True)
我必须为给定模板是最近模板的给定用户列表筛选邀请列表。
例如:
| id | user_id | template | user_time | user_date |
| -- | --------| -------- | --------- | ----------- |
| 5 | 3 | temp-A | 03:40PM | 19/04/2015 |
| 4 | 1 | temp-B | 03:40PM | 19/04/2015 |
| 3 | 2 | temp-A | 03:40PM | 19/04/2015 |
| 2 | 2 | temp-B | 01:30PM | 17/04/2015 |
| 1 | 1 | temp-A | 01:30PM | 17/04/2015 |
对于user_id 1,最近的模板基于temp-B
和user_date
为user_time
,而对于user_id 2和3,则为temp-A
。如果给定的用户列表为[1,2,3]
且给定的模板为temp-A
,则ID的结果列表应为[2,3]
。
如果我进行查询
Invite.objects.filter(user_id__in = user_id_list, template = 'temp-A').values_list('user_id', flat = True)
结果将是[1,2,3]
,因为所有用户都收到了模板temp-A
。但我想过滤给定模板是最近的用户。如何使用django过滤查询实现这一点而不使用任何循环?
答案 0 :(得分:0)
您正面临greatest-n-per-group
问题。在Django中,单个查询无法解决,但有两个。我要发布的以下内容并不完全符合您的要求,但非常接近它 - 返回每个用户每个最大邀请ID 的最新邀请(不是您想要的每个日期)。如果你不能使用它,我希望它至少会为你提供一些未来的方向。我也会尝试提出一个更好的解决方案。
invites = Invite.objects.filter(
id__in=User.objects.filter(
id__in=[1,2,3],
user_invite__template='temp-A'
).annotate(
max_invite_id=Max('user_invite__id')
).values_list('max_invite_id', flat=True)
)