
1 neoblackcap 2020-05-28 23:51:02 +08:00 多建一个多对多关系表,然后就好像普通情况一样用 join 声明关系 |
2 qixiangyangrm 2020-05-29 12:03:45 +08:00 |
3 johnsona 2020-05-29 13:36:11 +08:00 +1,无外键写法也是 join 的 |
4 johnsona 2020-05-29 13:40:25 +08:00 楼主搞定了吗,django 是软约束的,sqlalchemy 就一眼难尽了 |
5 johnsona 2020-05-29 13:41:04 +08:00 可能这就是 flask 拥护者追求的可扩展吧,自由选择一个 orm,结果没几个 orm 可选 |
6 johnsona 2020-05-29 13:59:55 +08:00 @qixiangyangrm 我试过,还是会生成外键 |
7 johnsona 2020-05-29 14:30:46 +08:00 一对多,看着里,有效,实际上底层执行的 join https://gist.github.com/nickretallack/7cf6d4f255b248a9f6ec |
8 LennonChin OP @qixiangyangrm 这种写法第三张关联表里也有外键约束的 |
9 LennonChin OP |
10 LennonChin OP @neoblackcap 你好,可以给个简单的示例吗?我试了一些方式都不成功。 |
11 CRITICAL7 2020-06-03 01:31:19 +08:00 emm 就是这么写吧大概。。官网 tutorial 改了改 ``` class User(Base): id = Column(Integer, primary_key=True) class UserAddress(Base): id = Column(Integer, primary_key=True) user_id = Column(Integer) address_id = Column(Integer) user = relationship("User", primaryjoin="foreign(UserAddress.user_id) == User.id") address = relationship("Address", primaryjoin="foreign(UserAddress.address_id) == Address.id") class Address(Base): id = Column(Integer, primary_key=True) ``` |
12 johnsona 2020-06-03 12:06:27 +08:00 @CRITICAL7 这种写法我写过,但稍微有点小问题,你在反序列化的时候,user 对象会有一个 address 字段,而每个 address 字段实际上是 UserAddress 对象,你再对 user 对象序列化,address 的格式大概是这样,address:[1,2,3],但数组中的数字是 UserAddress 的主键,不是 address 表的主键 |
13 johnsona 2020-06-03 12:07:49 +08:00 多对多实际上是你查询 user,带出来的 address 字段应该是 Address 对象,这时候三表连接好啦,你可以看看 lazy 属性,或许有收获,不过带来的性能损耗你是不想承受的 |
14 yuchenyang1994 2020-06-04 09:43:49 +08:00 唉,看来还是得我来 ``` class User(Base): id = Column(Integer, primary_key=True) user = relationship("User", primaryjoin="foreign(User.id) == remote(UserAddress.id)", backref=backref("user"), use_list=False, lazy="dynamic") class UserAddress(Base): id = Column(Integer, primary_key=True) user_id = Column(Integer) address_id = Column(Integer) ``` |
15 yuchenyang1994 2020-06-04 09:45:18 +08:00 use_list=True 一对多,False 一对一,layz="dynamic"就相当于,需要得时候再查,还可以接着过滤,backref 同理 |
16 gjquoiai 2020-06-05 10:51:36 +08:00 @jsisjs20130824 emm 这就是小问题了。。用 proxy 啥的都能解决 |
17 johnsona 2020-06-05 15:50:14 +08:00 @yuchenyang1994 人家问的是多对多,你的这个我已经贴 gist 了 |
19 SjwNo1 2020-06-05 18:41:28 +08:00 额外建一个 bridge 表可行吗 |
20 gjquoiai 2020-06-05 18:55:33 +08:00 @jsisjs20130824 sqlalchemy association proxy |