首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按相关模型子集的最新实例对django查询集进行排序

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

Stack Overflow用户
提问于 2012-12-07 13:01:29
回答 2查看 1.6K关注 0票数 3

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

代码语言:javascript
复制
queryset = Order.objects.all().annotate(
    latest_event_date=Max('order_event__event_datetime')
    ).order_by('latest_event_date')

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

我想我可以将过滤后的查询集与一个包含那些缺少调度event...but的订单的查询集结合起来,我不太确定该怎么做。我看到了与使用python list相关的答案,但如果有一个合适的django查询集(例如,用于带有分页的视图,等等)会更有用。

编辑回复:评论/建议

代码语言:javascript
复制
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。组合独立的、排序的查询集看起来很有前途,但我被卡住了。

EN

回答 2

Stack Overflow用户

发布于 2012-12-07 16:29:30

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

下面这样的方法应该是可行的:

代码语言:javascript
复制
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')

这有意义吗?

票数 1
EN

Stack Overflow用户

发布于 2015-09-07 09:12:49

Greg的回答很棒,我用了一段时间。但是,我想访问latest_event的其他字段。因此,我最终将latest_event存储为顺序字段:

代码语言:javascript
复制
# The latest event
latest_event = db.ForeignKey('whateverapp.Event', editable=False, null=True)

然后,我设置了一个信号,在保存时重新计算最新事件:

代码语言:javascript
复制
@receiver(post_save, sender=Event)
def visit_calculate_latest(sender, instance, **kwargs):
    """Recalculate latest event"""
    instance.parent.latest_event = instance.parent.get_latest_event()

其中get_latest_event()执行查询:

代码语言:javascript
复制
def get_latest_event(self):
    """Return most recent event or None."""
    try:
        return Event.objects.filter(
            parent=self.id).order_by('-event_date', '-id')[0]
    except IndexError:
        return None

现在我可以按latest_event__whatever进行过滤了:

代码语言:javascript
复制
    return qs.filter(qobjs).order_by('-latest_event__event_date',
        '-latest_event__pk')
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13757195

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档