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
|