我的数据库中有很多关系。问题是,当我提交表单时,不会填充多对多的表。
这是我模特的代码:
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)
我有两个班级Company
和Category
。公司可以有多个类别(稍后我将创建固定数量的类别)。
为了表明这一点,我创建了一个简单的多对多关系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 :(得分:0)
正如SQLAlchemy ORM tutorial所述:您需要为实例指定relationship
属性。在您的情况下,您需要设置Company.addresses_category
或Category.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')))