2012-04-21 1 views
0

У меня есть модель User и модель Thing. A User может иметь ноль или больше Thing s. A Thing может принадлежать нулю или более User s. Обычно я хотел бы добавить в третьей таблице Thing_Ownership связывающих User с до Thing с, но я хотел бы воспользоваться функцией backref SQLAlchemy, так что если бы я имел User экземпляр george я мог бы назвать george.inventory, чтобы получить список Thing с, которые принадлежат george ,Отношения «многие ко многим» без соединительной таблицы/модели

Каков наилучший способ для этого, или я должен добавить третью модель и реализовать User.inventory в качестве поиска по третьей модели Thing_Ownership для соответствующих отношений?

ответ

3

Ознакомьтесь с документацией SQLAlchemy по ссылкам Many to Many - он должен делать именно то, что вы ищете.

Так что если у вас есть модели для User и Thing, вы можете установить дополнительный параметр в ваших отношениях:

from sqlalchemy import Table, Integer, Column, ForeignKey 
from sqlalchemy.orm import relationship, backref 
from sqlalchemy.ext.declarative import declarative_base 

Base = declarative_base() 

association_table = Table('association', Base.metadata, 
    Column('user_id', Integer, ForeignKey('user.id')), 
    Column('thing_id', Integer, ForeignKey('thing.id')) 
) 

class User(Base): 
    __tablename__ = 'user' 
    # Whatever you need in this model 
    inventory = relationship('Thing', secondary = association_table, backref = 'users') 

class Thing(Base): 
    __tablename__ = 'thing' 
    # Whatever you need in this model 

Вы можете получить доступ к списку Thing с принадлежащими к User инстанцированный, как george по телефону george.inventory.

Надеюсь, это поможет.

EDIT: Перечитайте свой вопрос и увидите, что хотите использовать backref - добавлен код для этого.
РЕДАКТИРОВАТЬ 2: Оставленный действительно важный элемент.