我有一个订单模型和一个order_event模型。每个order_event都有一个要订购的外键。因此,从一个order实例中,我可以获得:myorder.order_event_set。我想要获得所有订单的列表,但我希望它们按最后一次活动的日期排序。这样的语句按最新事件日期排序:
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查询集(例如,用于带有分页的视图,等等)会更有用。
编辑回复:评论/建议
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。组合独立的、排序的查询集看起来很有前途,但我被卡住了。
发布于 2012-12-07 16:29:30
好的,我认为您可以使用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')这有意义吗?
发布于 2015-09-07 09:12:49
Greg的回答很棒,我用了一段时间。但是,我想访问latest_event的其他字段。因此,我最终将latest_event存储为顺序字段:
# The latest event
latest_event = db.ForeignKey('whateverapp.Event', editable=False, null=True)然后,我设置了一个信号,在保存时重新计算最新事件:
@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()执行查询:
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进行过滤了:
return qs.filter(qobjs).order_by('-latest_event__event_date',
'-latest_event__pk')https://stackoverflow.com/questions/13757195
复制相似问题