根据用户列表的字段获取最新信息

时间:2015-04-19 12:47:33

标签: python django django-models django-queryset

我有以下模型,并希望对此进行过滤查询。

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-Buser_dateuser_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过滤查询实现这一点而不使用任何循环?

1 个答案:

答案 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)
)