Załóżmy, że mam Peewee model, który wygląda mniej więcej następująco:Definiowanie pól wirtualnych peewee
class MyModel(peewee.Model):
a = peewee.IntegerField()
b = peewee.IntegerField()
I pragnę dodać obiekt do tego modelu, co następuje:
@property
def diff(self):
return self.a - self.b
ten czasami jest pomocne; teraz, jeśli Object
jest instancją MyModel
, mogę łatwo sprawdzić jej diff
z Object.diff
.
Co ja nie może zrobić to:
objects = list(MyModel.select().where(MyModel.diff < 17))
i to od MyModel.diff jest prosty własność, i prawdopodobnie jest zawsze większa niż 17. Nie jest to niczym MyModel.a < 17
Expression
.
Byłoby bardzo miło wystawić diff
tak, jakby było to pole; więc użytkownik tego API nie będzie musiał wiedzieć, czy konkretna implementacja ma jako rzeczywiste pola i jako rzeczywiste pola i diff
jako wirtualna, lub raczej a
i diff
jako rzeczywiste pola i b
jako wirtualna.
Oczywiście, moim prawdziwym zamiarem jest wykorzystanie właściwości, które w niektórych przypadkach obejmują znacznie bardziej wyrafinowane obliczenia niż te przedstawione na stronie diff
; Przykładem jest
@property
def complicated_property(self):
if 17 <= self.a <= 173:
return a_complicated_math_function(self.a + self.b)
return another_complicated_math_function(self.a * self.b ** 2)
Z drugiej strony może być bardzo proste właściwości, takich jak
@property
def seven(self):
return 7
Oznacza to, że nie może, na ogół, są przekształcane do SQL, ale raczej filtrować wyniki po pobraniu z bazy danych.
Czy to możliwe?
Aktualizacja
Właśnie odkryto Peewee Playhouse hybrydowy metody/właściwości. Stanowią one częściowe rozwiązanie mojego pytania.
Na przykład moja metoda diff
może stać się hybrid_property
i działać zgodnie z oczekiwaniami. Mój complicated_property
nie może stać się jednym, a przynajmniej tak się wydaje; warunek if
na początku powróci albo True
lub False
stale i nie będzie działał jako funkcja.
Peewee prawdopodobnie ma jeszcze trochę magii, która się tam kryje; Będę dalej przeglądał i raportował moje odkrycia.
Dzięki! I akceptuję również twoją krytykę ... i dzięki za peewee! – Bach