2017-02-20 7 views
0

У меня есть много-много отношений в моей БД. Проблема заключается в том, что многие-многие таблицы не заполняются, когда я отправляю свою форму.Sqlalchemy Многим многим не добавлять данные в DB

Это мой код для моих моделей:

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 должен автоматически добавлять внешние ключи компании и категории, если они созданы.

Это та часть, где я добавляю компанию и категорию к БД:

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.

Я уже пробовал несколько решений здесь, но они в основном предназначены для фляжки-sqlalchemy, а не для двунаправленного поведения. Мне нужно двунаправленное поведение, потому что, если компания удалена, многие удаленные отношения, в которых происходит компания, также должны быть удалены. Кроме того, если категория будет удалена (вероятно, не произойдет), все отношения с компаниями, в которых происходила эта категория, должны быть удалены.

Благодаря

ответ

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'))) 
Смежные вопросы