2016-12-17 5 views
6

sewiteのバックエンドを使用して、PeeweeのBと1対多の関係を持つオブジェクトモデルAがあるとします。私はいくつかのAのセットを取り出して、それぞれのBを最近のものと結合したいと思っています。彼らはループなしでこれを行う方法ですか?Peeweeのオブジェクトセットの最新の関連オブジェクトを取得する

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

意志よう

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

は当然、シングルトン結果を生成する、ORDER_BY呼び出し、リミット(1)、それはクエリ全体に適用されることであろうナイーブ方法私はどちらか間違っているか、それがこのために動作しませんプリフェッチを使用しています

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

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ではありません。誰もこれを行う方法を知っていますか?

答えて

1

私はfunctionとgroup_byを理解する必要があることを知っています。

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

この方法は、日付の最後のエントリではなく最新の日付を使用する場合にのみ使用できます。最後の日付エントリがデフォルトのエントリ(datetime.datetime.now)でない場合、このクエリは間違っています。唯一のAフィールドを持つ

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

:AとBフィールドを持つ

:この日付で

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

と関連レコード:

あなたは最後の日付エントリを見つけることができます:

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

最新のB.date(fn.Max(B.date)と同じように)を見つけて、whereフィルタとして使用する場合:

関連する問題