2016-12-02 8 views
1

У меня есть компания с кодом страны, бизнес-ID, и список сотрудников:Ребенок с несколькими внешними ключами к родительскому?

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')) 

Но говорят данные изменения contantly и id не всегда одинаковы для одной и той же компании (а компания может быть удалена из базы данных, а затем повторно добавлена ​​позже с разными id). Однако комбинация country_code и business_idвсегда гарантирована как уникальная, так и постоянная для той же компании.

Как создать два внешних ключей для Employee, которые указывают на Company «s country_code и business_id?

Я попытался сделать это с помощью старой StackOverflow вопроса, но он поднял ошибку, 'str' не следует использовать:

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']) 

Однако синтаксис языка Python позволяет мне ссылаться на самом класс.

ответ

1

Я не уверен, что именно то, что вы просите, но пример кода делает две вещи, которые я думаю, было бы полезно:

  1. определяют составной внешний ключ
  2. указать, какой внешний ключ для использования для отношений между Company и Employee

Модель:

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

Я понятия не имею, что все таблицы args и т. Д. Точно означают, но, похоже, он работал точно так, как я этого хотел. Спасибо чувак! :) –

Смежные вопросы