SQLAlchemy - 带backref的mapped orm.relation与双向orm.relation的区别
在某个项目中,我需要根据用户的要求,在运行时对两个表进行映射,这两个表之间有一对多的关系(一个表有一个外键字段)。
根据我从文档中了解到的,通常的做法是在没有外键的表上添加一个orm.relation,并使用mapped_collection作为集合类,同时设置一个backref,这样最终两个表的orm对象就可以互相映射到各自的属性上(一个表通过orm.relation的集合类拥有一个集合,另一个表则通过backref拥有一个属性)。
但我现在的情况是,有时候我只想让外键那一侧有一个映射到另一个表的属性(就是那个由backref创建的属性),这取决于用户的选择(他可能只想要那一侧的映射)。
所以我在想,是否可以在外键表上也使用orm.relation,这样我可能会在没有外键的表上像之前一样有一个orm.relation和mapped_collection,但没有backref,同时在外键表上再添加一个orm.relation来替代那个自动生成的backref(这样两个表就都有orm.relation,互相映射)。
这样做会有问题吗?结果是否和在没有外键的表上只用一个带backref的orm.relation是一样的?有没有其他方法可以只在外键那一侧进行映射,而不需要在没有外键的表上也映射那个带backref的字典?
1 个回答
1
我现在自己找到了答案:
如果你从每一边都使用一个 orm.relation
,而没有使用反向引用(backrefs),那么你必须使用 back_populates
。否则,如果你在一边做了修改,另一边的映射就不会正确更新。
所以,从每一边使用 orm.relation
而不是自动的反向引用是可以的,但你必须相应地使用 back_populates
。