2017-02-20 38 views
0

我在我的数据库中有多对多的关系。问题在于,当我提交表单时,许多表格都没有填充。Sqlalchemy多对多没有添加数据到数据库

这就是我对我的模型代码:

CompanyCategory = Table('CompanyCategory', Base.metadata, 
    Column('id', Integer, primary_key=True), 
    Column('categoryId', Integer, ForeignKey('categories.id')), 
    Column('companyId', Integer, ForeignKey('companies.id'))) 

class Company(Base): 
    __tablename__ = 'companies' 
    id = Column(Integer, primary_key=True) 
    company_name = Column(Text, nullable=False) 
    users_id = Column(Integer, ForeignKey('users.id')) 
    users = relationship("User", backref=backref('users', cascade="all, delete-orphan"), 
          lazy='joined') 

    # foreign key for category 
    addresses_category = relationship('Category', secondary=CompanyCategory, backref='companies') 

    def __init__(self, company_name=None, users_id=None): 
     self.company_name = company_name   
     self.users_id = users_id 

    def get(self, id): 
     if self.id == id: 
      return self 
     else: 
      return None  

    def __repr__(self): 
     return '<%s(%r, %r, %r)>' % (self.__class__.__name__, self.id, self.company_name, self.users_id) 

class Category(Base): 
    __tablename__ = 'categories' 
    id = Column(Integer, primary_key=True) 
    category_name = Column(Text, nullable=False) 
    addresses_company = relationship('Company', secondary=CompanyCategory, backref='categories') 

    def __init__(self, category_name=None): 
     self.category_name = category_name 

    def get(self, id): 
     if self.id == id: 
      return self 
     else: 
      return None  

    def __repr__(self): 
     return '<%s(%r, %r)>' % (self.__class__.__name__, self.id, self.category_name) 

我有两个类CompanyCategory。一家公司可以有多个类别(稍后会有我将创建的固定数量的类别)。

为了证明这一点,我创建了一个简单的多对多关系CompanyCategory

据我所知,sqlalchemy应自动添加公司和分类的外键,如果这些创建。

这是部分在那里我加入一家公司,一类为DB:

new_user_company = Company(company_name=form.company_name.data.strip(), users_id = new_user.id) 

if new_user_company: 
    db_session.add(new_user_company) 

    db_session.commit()     

    new_user_company_category = Category(category_name=form.category_name.data) 

    if new_user_company_category: 

     db_session.add(new_user_company_category) 

     db_session.commit() 

在这种情况下,数据被加入到公司,也类别,但有于CompanyCategory没有条目。

我已经在这里尝试了一些解决方案,但他们主要是用于flask-sqlalchemy,而不是用于双向行为。我需要双向行为,因为如果公司被删除,公司发生的所有多对多关系也应该被删除。此外,如果一个类别将被删除(不可能发生),所有与这些类别发生的公司的关系应该被删除。

感谢

回答

0

由于SQLAlchemy ORM tutorial解释说:你需要指定一个实例relationship属性。你的情况,你需要设置Company.addresses_categoryCategory.addresses_company

new_user_company = Company(company_name=form.company_name.data.strip(), users_id = new_user.id) 

if new_user_company: 
    db_session.add(new_user_company) 

    db_session.commit()     

    new_user_company_category = Category(category_name=form.category_name.data) 

    new_user_company_category.addresses_company.append(new_user_company) 

    if new_user_company_category: 

     db_session.add(new_user_company_category) 

     db_session.commit() 

此外,如果你需要删除的关系,如果父对象之一被删除,最好是设置ondelete属性:

CompanyCategory = Table('CompanyCategory', Base.metadata, 
    Column('id', Integer, primary_key=True), 
    Column('categoryId', Integer, ForeignKey('categories.id', ondelete='CASCADE')), 
    Column('companyId', Integer, ForeignKey('companies.id', ondelete='CASCADE')))