2016-11-22 3 views
0

Ich habe die folgenden 3 SQL Alchemy ModelleWie Sie diese Fremdschlüsselbeziehungen in SQLAlchemy abfragen?

class MyModelA(db.Model): 
    a_id = db.Column(db.Integer, nullable=False, primary_key=True) 
    my_field1 = db.Column(db.String(1024), unique=True) 

class MyModelB(db.Model): 
    b_id = db.Column(db.Integer, nullable=False, primary_key=True) 
    my_field2 = db.Column(db.String(1024), nullable=True) 

    def my_method(self, arg_my_field1): 
     pass # what goes here?? 

class MyModelC(db.Model, Timestamp): 
    c_id = db.Column(db.Integer, nullable=False, primary_key=True) 
    a_id = db.Column(db.Integer, db.ForeignKey(MyModelA.a_id), default=lambda: MyModelA.query.filter(MyModelA.my_field1 == 'XYZ').one().a_id) 
    a = db.relationship('MyModelA', backref=db.backref('my_model_c')) 
    b_id = db.Column(db.Integer, db.ForeignKey(MyModelB.b_id), nullable=False) 
    b = db.relationship('MyModelB', backref=db.backref('my_model_c')) 
    my_field3 = db.Column(db.String(1024), unique=True) 
    __table_args__ = (db.UniqueConstraint('a_id', 'b_id', name='unique_constraint_aid_bid'),) 

Bei dem Verfahren my_method, ich möchte den my_field3 Bereich der Instanz von MyModelC dass (Punkte auf self und verweist auf die MyModelA zurückzuversetzen my_field1 als Fall hat -unempfindliche Übereinstimmung von arg_my_field1). Es sollte maximal eine solche Instanz geben. Wenn keine solche Instanz von MyModelC existiert, geben Sie None zurück.

Welche SQLAlchemy Abfrage sollte ich in my_method schreiben, um dieses Ergebnis zu erreichen? Hier

Antwort

0

ist die Antwort

def my_method(self, arg_my_field1): 
    return self.my_model_c.join(MyModelA).filter(MyModelA.my_field1.ilike(arg_my_field1)).one().my_field3 

Es lazy='dynamic' in MyModelC zu den beiden Beziehungen hinzugefügt werden muss, wie unten dargestellt:

class MyModelC(db.Model, Timestamp): 
    c_id = db.Column(db.Integer, nullable=False, primary_key=True) 
    a_id = db.Column(db.Integer, db.ForeignKey(MyModelA.a_id), default=lambda: MyModelA.query.filter(MyModelA.my_field1 == 'XYZ').one().a_id) 
    a = db.relationship('MyModelA', backref=db.backref('my_model_c', lazy='dynamic')) 
    b_id = db.Column(db.Integer, db.ForeignKey(MyModelB.b_id), nullable=False) # MODIFIED 
    b = db.relationship('MyModelB', backref=db.backref('my_model_c', lazy='dynamic')) # MODIFIED 
    my_field3 = db.Column(db.String(1024), unique=True) 
    __table_args__ = (db.UniqueConstraint('a_id', 'b_id', name='unique_constraint_aid_bid')) 
Verwandte Themen