2016-12-02 2 views
1

Ich habe ein Unternehmen mit einem Ländercode, eine Business-ID und einer Liste der Angestellten:Kind mit mehreren Fremdschlüsseln an Eltern?

class Company(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    business_id = db.Column(db.String(20), nullable=False) 
    country_code = db.Column(db.String(2), nullable=False) 
    employee = db.relationship('Employee', backref='company') 

class Employee(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    company_id = db.Column(db.Integer, db.ForeignKey('company.id')) 

Aber sagen contantly die Datenänderungen und die id ist nicht immer das gleiche für die gleiche Firma (a Firma könnte aus der Datenbank entfernt werden, später wieder mit verschiedenen id hinzugefügt). Jedoch ist die Kombination country_code und business_idimmer, die garantiert einzigartig und konstant für dieselbe Firma ist.

Wie erstelle ich zwei Fremdschlüssel für Employee, die in Companycountry_code und business_id zeigen?

Ich habe versucht, dies durch eine ältere Stackoverflow Frage zu tun, aber es wird eine Fehler dass 'str' sollten nicht verwendet werden:

class Company(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    business_id = db.Column(db.String(20), nullable=False) 
    country_code = db.Column(db.String(2), nullable=False) 
    employee = db.relationship('Employee', backref='company', foreign_keys=['Company.business_id', 'Company.country_code']) 
jedoch

, Syntax hindert mich Pythons von bezieht sich auf die Klasse.

Antwort

1

Ich bin nicht sicher genau, was Sie fordern, aber die folgende Codebeispiel zwei Dinge, die ich denke, wäre hilfreich:

  1. definieren ein Verbundfremdschlüssel
  2. angeben, welche Fremdschlüssel zu verwenden für die Beziehung zwischen Company und Employee

Modell:

class Company(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    business_id = db.Column(db.String(20), nullable=False) 
    country_code = db.Column(db.String(2), nullable=False) 
    name = db.Column(db.String(), nullable=False) 

    employee = db.relationship(
     'Employee', backref='company', 
     # 2. indicate FK to use below 
     foreign_keys=lambda: [Employee.business_id, Employee.country_code], 
     # foreign_keys=lambda: Employee.company_id, 
    ) 


class Employee(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    company_id = db.Column(db.ForeignKey('company.id')) 
    name = db.Column(db.String(), nullable=False) 

    business_id = db.Column(db.String(20), nullable=False) 
    country_code = db.Column(db.String(2), nullable=False) 

    # 1. define a composite foreign key 
    __table_args__ = (
     db.ForeignKeyConstraint(
      ['business_id', 'country_code'], 
      ['company.business_id', 'company.country_code'] 
     ), 
    ) 
+0

Ich habe keine Ahnung was alle Tabellenargumente etc. genau meinen, aber es scheint genau so zu funktionieren, wie ich es wollte. Danke, Mann! :) –