Sqlalchemy сопоставление многих ко многим с дополнительными полями - PullRequest
2 голосов
/ 12 октября 2011

Я создал отношения многие ко многим с sqlalchemy, как это:

subject_books = Table('subject_books', Base.metadata,
    Column('subject_id', Integer, ForeignKey('subjects.id')),
    Column('book_id', Integer, ForeignKey('books.id')),
    Column('group', Integer)
)

class Subject(Base):
    __tablename__ = 'subjects'
    id = Column(Integer, primary_key=True)
    value = Column(Unicode(255), unique=True)

class Book(Base):
    __tablename__ = 'books'
    id =  Column(Integer, primary_key=True)
    title = Column(Unicode(255))
    isbn = Column(Unicode(24))
    subjects = relationship('Subject', secondary=subject_books, collection_class=attribute_mapped_collection('group'), backref='books')

после этого я создал тест, подобный следующему:

book = Book(title='first book',isbn='test')
book.subjects[0] = Subject(value='first subject')
book.subjects[1] = Subject(value='second subject')

session.add(book)
transaction.commit()

и работает нормально. Но то, что я действительно хочу, это хранить более одного субъекта с одинаковым значением group , поэтому я попробовал следующий тест:

book = Book(title='first book',isbn='test')
book.subjects[0] = [Subject(value='first subject'),Subject(value='second subject')]
book.subjects[1] = [Subject(value='third subject'),Subject(value='forth subject')]

session.add(book)
transaction.commit()

но это не работает.

Можно ли это сделать с помощью sqlalchemy?

Заранее спасибо

1 Ответ

5 голосов
/ 12 октября 2011

Рази

Я думаю, что вы строите неправильный корабль отношений.

Ваш корабль отношений должен быть

книга M2M предмет

предметная группа M2M

Таким образом, вам нужно создать еще одну модель для группы, и ее нужно назначить как m2m в теме

Ваши модели будут похожи.

subject_books = Table('subject_books', Base.metadata,
    Column('subject_id', Integer, ForeignKey('subjects.id')),
    Column('book_id', Integer, ForeignKey('books.id')),        
)
subject_group = Table('subject_groups', Base.metadata,
    Column('group_id', Integer, ForeignKey('groups.id')),
    Column('subject_id', Integer, ForeignKey('subjects.id')),
)

class Subject(Base):
    __tablename__ = 'subjects'
    id = Column(Integer, primary_key=True)
    value = Column(Unicode(255), unique=True)
    groups = relationship('Groups', secondary=subject_groups, backref='subjects')

class Groups(Base):
    __tablename__ = 'groups'
    id = Column(Integer, primary_key=True)
    name = Column(Unicode(255), unique=True)

class Book(Base):
    __tablename__ = 'books'
    id =  Column(Integer, primary_key=True)
    title = Column(Unicode(255))
    isbn = Column(Unicode(24))
    subjects = relationship('Subject', secondary=subject_books, backref='books')

Я также проверяю документы на attribute_mapped_collection .Но каждый раз я обнаруживал, что каждый ключ связан только с одним объектом, а не с одним.Если вы читаете где-либо, предоставьте ссылку, чтобы я мог проверить, как она будет вписываться в ваш код.

Думаю, это вам поможет.

...