Wpis z mikrobloga

Siema mirki z Python, jaki jest preferowany/właściwy sposób budowania dziedzina dla klas ze sqlalchemy po klasach spoza tej biblioteki?
Chciałbym, aby klasa będąca modelem ORM ze sqlalchemy (powiedzmy User), dziedziczyła po klasie nie będącej takim modelem, powiedzmy Innaklasa z jakiegoś innego modułu. Zamysł jest taki, że metody z Innaklasa operują na danych które wyciągam z SQL używając klasy User. To pozwala na używanie klasy Innaklasa niezależnie od bazy danych.

Problem jest taki, że sqlalchemy ma jakiś własny schemat inicjalizacji obiektów. Przykład:
Przypadek 1: tworzę instancję używając konstruktora u = User(x, y, z). Wszystko jest ok, ponieważ - w metodzie __init__ wywołuję Innaklasa.__init__(self, x, y, z).
Przypadek 2: tworzę instancję z użyciem kwerendy u = session.query(User).filter_by(x=x).first(). W tym przypadku __init__ się nie wywołuje i chociaż powstały obiekt zawiera metody dziedziczone po klasie Innaklasa, to nie zawiera atrybutów zdefiniowanych w Innaklasa.__init__, a nie zdefiniowanych w User. Dodam, że są to atrybuty "prywatne", nie muszę i nie chcę ich zmieniać. Cała "sensowna" reszta jest definiowana w User.__init__()
#python #sqlalchemy #orm
  • 1
  • Odpowiedz
@grajlord: Ok, już wiem. Obiekty przy kwerendzie są inicjowane z pominięciem __init__. Trzeba dodać metodę z dekoratorem @sqlalchemy.orm.reconstructor, a w niej np. wywołać self.__init__() na jakichś własnych argumentach.
  • Odpowiedz