【问题标题】:Django Query: Get from one where latest of many is x?Django Query:从一个最新的 x 获取?
【发布时间】:2014-04-05 13:47:38
【问题描述】:

说你表用户(一个):id和活动(很多):类型,created_on,你如何获得所有最新activity.type是'message'的用户?

这是我目前的查询:

User.objects.filter(activity__type='message').annotate(Max('activity__created_on'))

但它不起作用,因为:

User.objects.filter(activity__type='message').annotate(Max('activity__created_on'))[0].activity.latest('created_on').type

不等于“消息”。

【问题讨论】:

    标签: python django orm


    【解决方案1】:

    我相信它不起作用,因为当您 filter(activity__type='message') Django 正在为该用户执行所有活动并丢弃 用户 如果它有一个类型不是 message 的活动时,它是不丢弃活动

    如果您使用的是 PostgreSQL,则可以使用 distinct 并从 User 模型中获取字段,虽然不是它们的实际实例,但这对您来说可能就足够了:

    Activity.objects.order_by('user__username', 'created_on')\
                    .distinct('user__username')\
                    .filter(type='message')\
                    .values('user__username')
    

    如果您不使用 PostgreSQL 或需要完整的 User 实例,则需要在 Python 中手动完成,例如:

    users_with_message_activity = []
    for u in User.objects.all():
        if u.activities_set.latest('created_on').type == 'message':
            users_with_message_activity.append(u)
    

    这并不理想,因为这意味着更多的查询。

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-16
      • 2018-11-18
      • 2013-06-24
      • 1970-01-01
      相关资源
      最近更新 更多