2017-11-26 27 views
0

Ich schreibe einige Domain-Klasse wie:SQLAlchemy-Klasse haben eine Klassenvariable keine Instanzvariable?

class Klient(Base): 
    __tablename__ = 'klient' 
    __table_args__ = (
     Index('pg_klient_index', 'nums', 'sals', 'k_id'), 
    ) 
    def __init__(self): 
     self.dogovors=list() 
    adrrab = Column(String(200)) 
    c1uid = Column(String(45)) 
    cods = Column(String(10)) 
    d_first = Column(Date) 
    d_vidan = Column(Date) 
    docum = Column(String(40)) 
    doljn = Column(String(160)) 
    id = Column(BigInteger, primary_key=True, server_default=text("nextval('klient_id_seq'::regclass)")) 
    inn = Column(String(15)) 
    izm = Column(Date) 
    k_id = Column(BigInteger, nullable=False) 
    ..... 
    vidan = Column(String(300)) 
    xmldat = Column(Date) 
    xmlnum = Column(String(15)) 
    zak = Column(Numeric(1, 0)) 
    dogovors = [] 

ich wählen Sie alle Datensätze mit Code:

klients = ss.query(Klient).all() 
for k in klients: 
    q = ss.query(Dogovor).filter(Dogovor.sals == k.sals, Dogovor.kl_id == k.k_id).all() 
    if len(q): 
     k.dogovors.extend(q) 

Und ich sehe ein unerwartetes Verhalten:

enter image description here

enter image description here

enter image description here

Jedes Objekt haben eine gleiche Instanz von dogovors wie es möglich ist?

UPD:

Ich versuchte schreiben:

class Klient(Base): 
    __tablename__ = 'klient' 
    __table_args__ = (
     Index('pg_klient_index', 'nums', 'sals', 'k_id'), 
    ) 
    def __init__(self): 
     self.dogovors=list() 
    adrrab = Column(String(200)) 
    c1uid = Column(String(45)) 

aber ich habe den Fehler AttributeError: 'Klient' object has no attribute 'dogovors'

+1

Sie alles anderes als 'self.dogovors gemacht = list() 'class variables – user1767754

+0

Warum machst du manuell was" orm.relatuonship "ist? –

+0

Beziehung sogar. Verdammt mobile Tastatur und Wurst Finger. –

Antwort

0

Some docs about that Wenn SQLAlchemy Instanz der Klasse erstellen Sie es nicht init Methode hat auszuführen. Wenn Sie eine Methode ausführen müssen, müssen Sie es markieren mit @orm.reconstructor

Аfter, dass alles funktioniert, wie es sollte:

enter image description here

enter image description here

Verwandte Themen