【问题标题】:Django - latest object for each object in querysetDjango - 查询集中每个对象的最新对象
【发布时间】:2018-10-08 09:38:36
【问题描述】:
class Order(models.Model):
   # ..fields
   user = models.ForeignKey(User, on_delete=models.CASCADE)
   date_added = models.DateTimeField(auto_now_add=True)

我想获取所有用户,并为每个用户添加其最新订单 - 例如 date_added 最大的用户的Order。我想在 单个查询 中执行此操作(在 SQL 中,这将通过一个查询完成)。

这是我尝试过的:

users = User.objects.all().annotate(last_order=Max('order__date_added'))

但这只会给我最后一个订单的日期,我想要 Order 对象本身。

【问题讨论】:

  • User.objects.annotate(last_order=Max('order__date_added')).values('order__user', 'last_order').order_by('order__user') 您需要将 order by 添加到 group by user
  • 我必须使用 .values() 吗?我仍然需要一个查询集实例
  • 如果您不需要通过注释进行过滤,简单的解决方案是将属性(方法)添加到您的模型用户。
  • 这将需要多个查询,我认为不可能通过类属性进行过滤

标签: python django django-queryset django-orm


【解决方案1】:

型号:

class User(models.Model):
    ...
    def get_latest_order(self):
        return self.order_set.latest('date_added')

观看次数

user = User.objects.all()
for u in user:
    print(u.get_latest_order())

【讨论】:

  • 这将为每个用户进行查询,这正是我现在所拥有的并且我想避免的。
  • 在您的问题中,您说“我想获取所有用户,并为每个用户添加其最新订单”,因此我的代码会获取所有用户及其最新订单。
  • 我认为很明显我想在一个查询中执行此操作。无论如何更新了问题
  • 我仍然看到同样的问题。明确你想要什么,只是用户对象,只是最新订单对象或两者兼而有之。
猜你喜欢
  • 2016-08-06
  • 2019-08-09
  • 2014-02-06
  • 2015-07-15
  • 1970-01-01
  • 2017-08-12
  • 1970-01-01
  • 2010-11-02
  • 2011-03-04
相关资源
最近更新 更多