获取Peewee中对象集的最新相关对象

时间:2016-12-17 19:01:59

标签: python sqlite peewee

假设我有一个对象模型A,它与Peewee中的B有一对多的关系,使用sqlite后端。我想获取一些A并使用最近的B.加入每个A。他们是否可以在不循环的情况下执行此操作?

class A(Model):
    some_field = CharField()
class B(Model):
    a = ForeignKeyField(A)
    date = DateTimeField(default=datetime.datetime.now)

天真的方式是调用order_by和limit(1),但这适用于整个查询,所以

q = A.select().join(B).order_by(B.date.desc()).limit(1)

将自然地产生单例结果,

q = B.select().order_by(B.date.desc()).limit(1).join(A)

我要么使用prefetch错误,要么它不起作用,因为

q1 = A.select()
q2 = B.select().order_by(B.date.desc()).limit(1)
q3 = prefetch(q1,q2)
len(q3[0].a_set)
len(q3[0].a_set_prefetch)

根据需要,这些集合中的任何一个都不具有长度1。有谁知道怎么做?

2 个答案:

答案 0 :(得分:1)

我意识到我需要理解函数和group_by。

q = B.select().join(A).group_by(A).having(fn.Max(B.date)==B.date)

答案 1 :(得分:0)

只有当您想要最新日期而不是日期的最后一个条目时,才能以这种方式使用它。如果最后一个日期条目不是默认条目(datetime.datetime.now),则此查询将是错误的。

您可以找到最后一个日期条目:

last_entry_date = B.select(B.date).order_by(B.id.desc()).limit(1).scalar()

以及与此日期相关的A记录:

带有A和B字段的

q = A.select(A, B).join(B).where(B.date == last_entry_date)

只有A字段:

q = B.select().join(A).where(B.date == last_entry_date)

如果您想查找最新的B.date(与fn.Max(B.date)一样)并将其用作where过滤器:

latest_date = B.select(B.date).order_by(B.date.desc()).limit(1).scalar()