假设我有一个对象模型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。有谁知道怎么做?
答案 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()