3

我有一个 Marketorders 类,其中包含有关单一市场订单的信息,它们收集在市场快照中(由 Snapshot 类表示)。每个订单可以出现在多个快照中,最后一行当然是相关的。

class Marketorders(models.Model):
    id = models.AutoField(primary_key=True)
    snapid = models.IntegerField()
    orderid = models.IntegerField()
    reportedtime = models.DateTimeField(null=True, blank=True)
    ...


class Snapshot(models.Model):
    id = models.IntegerField(primary_key=True)
    ...

我正在做的是跨多个快照获取所有订单以进行处理,但我只想包含每个订单的最新行。在 SQL 中,我会简单地做:

SELECT m1.* FROM marketorders m1 WHERE reportedtime = (SELECT max(reportedtime)  
FROM marketorders m2 WHERE m2.orderid=m1.orderid);

或者更好的是加入:

SELECT m1.* FROM marketorders m1 LEFT JOIN marketorders m2 ON 
m1.orderid=m2.orderid AND m1.reportedtime < m2.reportedtime 
WHERE m2.orderid IS NULL;

但是,我只是不知道如何使用 Django ORM 来做到这一点。有没有办法在没有原始 SQL 的情况下做到这一点?

编辑:只是为了澄清问题。假设我们有以下市场订单(忽略所有不重要的内容,只使用 orderid、reportedtime):

1, 09:00:00
1, 10:00:00
1, 12:00:00
2, 09:00:00
2, 10:00:00

如何使用 ORM 获得以下设置?

1, 12:00:00
2, 10:00:00
4

2 回答 2

2

如果我理解正确,您需要一个 Marketorder 对象列表,其中包含每个 Marketorder 以及每个 orderid 的最高报告时间

像这样的东西应该可以工作(免责声明:没有直接测试):

m_orders = Marketorders.objects.filter(id__in=(
    Marketorders.objects
        .values('orderid')
        .annotate(Max('reportedtime'))
        .values_list('id', flat=True)
))

对于文档检查:

http://docs.djangoproject.com/en/dev/topics/db/aggregation/

编辑:这应该得到一个具有最高报告时间的特定订单ID的单个市场订单

order = (
    Marketorders.objects
        .filter(orderid=the_orderid)
        .filter(reportedtime=(
            Marketorders.objects
                .filter(orderid=the_orderid)
                .aggregate(Max('reportedtime'))
                ['reportedtime__max']
        ))
)
于 2009-09-15T12:46:17.613 回答
0

您是否有充分的理由不使用ForeignKey或(在您的情况下更好)ManyToManyField。这些字段代表了你的模型的关系结构。

此外,不需要声明 pk-field id。如果没有定义 pk,django 会添加 id。

下面的代码允许这样的 orm 查询:

   m1 = Marketorder()
   m1.save() # important: primary key will be added in db
   s1 = Snapshot()
   s2 = Snapshot()
   s1.save()
   s2.save()
   m1.snapshots.add(s1)
   m1.snapshots.add(s2)
   m1.snapshots.all()
   m1.snapshots.order_by("id") # snapshots in relations with m1 
                               # ordered by id, that is added automatically
   s1.marketorder_set.all()    # reverse

所以对于您的查询

snapshot = Snapshot.objects.order_by('-id')[0] # order desc, pick first
marketorders = snapshot.marketorder_set.all()  # all marketorders in snapshot

或紧凑

marketorders = Snapshot.objects.order_by('-id')[0].marketorder_set.all()

模型.py

class Snapshot(models.Model):
    name = models.CharField(max_length=100)

class Marketorder(models.Model):
    snapshots = models.ManyToManyField(Snapshot)
    reportedtime = models.DateTimeField(auto_now= True)

按照惯例,所有模型类名称都是单数的。Django 自动在不同的地方使其复数。

更多关于查询(过滤、排序、复杂查找)。必读。

于 2009-09-15T17:42:28.877 回答