django - 按相关模型子集的最新实例对 Django 查询集进行排序

标签 django django-queryset django-aggregation django-related-manager

我有一个 Order 模型和 order_event 模型。每个 order_event 都有一个要订购的外键。所以从订单实例中我可以获得:myorder.order_event_set。我想获得所有订单的列表,但我希望它们按最后一个事件的日期排序。像这样的语句可以按最近的事件日期排序:

queryset = Order.objects.all().annotate(
    latest_event_date=Max('order_event__event_datetime')
    ).order_by('latest_event_date')

但是,我真正需要的是按事件子集的最新日期排序的所有订单的列表。例如,我的事件被分类为"dispatch"、“处理”等。所以我应该能够获得按最新调度事件排序的所有订单的列表。这个 django 文档 (https://docs.djangoproject.com/en/dev/topics/db/aggregation/#filter-and-exclude) 显示了我如何使用过滤器获取最新的计划事件,但这排除了没有计划的订单事件。

我想我可以将过滤后的查询集与包含那些缺少计划事件的订单的查询集结合起来...但我不太确定如何执行此操作。我看到了与使用 python 列表相关的答案,但是拥有一个适当的 django 查询集(即对于带有分页的 View 等)会更有用

编辑回复:评论/建议

class Order(models.Model):
    desc = models.CharField(max_length=30)

class Order_event(models.Model):
    order = models.ForeignKey(Order)
    event_datetime = models.DateTimeField(auto_now_add = True)

此外,我不介意在多个声明中这样做。此外,通过 python 而不是 orm 进行排序等是可以的,因为我没有使用庞大的数据集。如果可能的话,出于您提到的原因,我宁愿远离 sql​​。组合单独的、排序的查询集似乎很有希望,但我被卡住了。

最佳答案

好的,我认为您可以使用 extra 来实现这一点方法,但据我所知,它不是纯数据库不可知的 orm。这意味着您必须确保您的 sql 适用于您正在使用的数据库后端,并且要警惕 django 对表名使用别名,但这也意味着您可以通过一个查询完成所有操作。

按照这些思路应该可以工作:

latest_event_subquery = 'select max(event_datetime) ' \
                        'from appname_order_event ' \
                        'where appname_order_event.category="scheduling" and ' \
                              'appname_order_event.event_id=appname_order.id'
queryset = Order.objects.extra(select={'latest_event_date': latest_event_subquery}).order_by('latest_event_date')

这有意义吗?

关于django - 按相关模型子集的最新实例对 Django 查询集进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13757195/

相关文章:

django - 编程错误 : when using order_by and distinct together in django

Django 测试内存中的 SQLlite - 测试运行期间缺少表

python - 将 SQL 查询转换为 ORM 查询 Django

Django ORM : Filter on timedelta of Datetime fields

python - 使用子查询注释计数

python - Django生成 'WHERE ... BETWEEN ...'句?

django - 无效的命令 'WSGIScriptAlias' ,可能拼写错误或由未包含在服务器配置中的模块定义

mysql - 简化我的 Django 查询逻辑

python - 使用 'or' 合并查询集时,两侧不能有 extra(select=...)

Django:按日期分组(日、月、年)