【问题标题】:Get recent based on field for list of users根据用户列表的字段获取最新信息
【发布时间】:2015-04-19 12:47:33
【问题描述】:

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

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_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 过滤器查询来实现这一点?

【问题讨论】:

    标签: python django django-models django-queryset


    【解决方案1】:

    您正面临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)
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-18
      • 1970-01-01
      • 2019-06-20
      • 2018-12-20
      • 1970-01-01
      • 2021-04-24
      相关资源
      最近更新 更多