2016-12-17 13 views
6

Załóżmy, że mam model obiektowy A z relacją jeden-do-wielu z B w Peewee przy użyciu backendu sqlite. Chcę pobrać jakiś zestaw A i dołączyć do każdego z ich najnowszym B. Czy jest to sposób, aby to zrobić bez pętli?Pobieranie najnowszego powiązanego obiektu dla zestawu obiektów w Peewee

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

Naiwny sposobem byłoby nazwać order_by i graniczna (1), ale które odnoszą się do całego zapytania, więc

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

naturalnie produkować singleton wynik, podobnie jak

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

ja albo używając prefetch źle lub nie działa na tym, bo

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) 

Żaden z tych zestawów nie ma długości 1, zgodnie z życzeniem. Czy ktoś wie, jak to zrobić?

Odpowiedz

1

Zdaję sobie sprawę, że muszę zrozumieć funkcje i group_by.

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

Możesz używać go w ten sposób, tylko jeśli chcesz wprowadzić najnowszą datę, a nie ostatni wpis daty. Jeśli ostatnia data nie jest ustawiona domyślnie (datetime.datetime.now), to zapytanie będzie błędne.

można znaleźć wpisu ostatnia data:

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

i związane rekordy z tej dacie:

z pól A i B:

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

tylko z pól A :

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

Aby znaleźć najnowszą wersję B.date (jak w przypadku modelu fn.Max(B.date)) i używać go jako filtru where:

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