relationship = db.Table(
'parent_child', db.metadata,
db.Column('parent_id', db.Integer, db.ForeignKey('category.id')),
db.Column('child_id', db.Integer, db.ForeignKey('category.id'))
)
class Category(db.Model):
__tablename__ = 'category'
all_parents = db.relationship(
'Category',
secondary='relationship',
foreign_keys=[relationship.columns.parent_id],
)
def on_create(category, parent_id, oldvalue, initiator):
parent = Category.query.get(parent_id)
if parent:
category.all_parents.append(parent)
db.event.listen(Category.parent_id, 'set', Category.on_create)
db.session.add(category)
db.session.commit()
Я хочу многозначных отношений со ссылками, но код сохраняет только одну сторону в таблице ассоциаций, другая всегда равна NULL:
parent_id | child_id
-----------------------
95 | NULL
-----------------------
99 | NULL
-----------------------
...
Я получил предупреждение в консоли:
SAWarning: Usage of the 'collection append' operation is not currently supported
within the execution stage of the flush process. Results may not be consistent.
Consider using alternative event listeners or connection-level operations instead.
"event listeners or connection-level operations instead." % method
Поэтому я пытаюсь добавить родителя после коммита, он не работает:
db.session.add(category)
db.session.commit()
category.all_parents.append(category.parent)
db.session.add(category)
db.session.commit()