Python中Django如何一次查询3张表?
3 张表里的字段名一致
我在 Googld 搜索的结果都是查询 2 张表的
请问如何一次查多张表呢?
Python中Django如何一次查询3张表?
在Django里一次查三张表,最直接的就是用select_related和prefetch_related来搞定外键和反向关联,避免N+1查询。
情况一:有外键链式关联
比如 ModelA -> ModelB -> ModelC,可以直接用select_related:
queryset = ModelA.objects.select_related('b_field__c_field').all()
for a in queryset:
print(a.b_field.c_field.some_field) # 这里不会产生额外查询
情况二:多对多或反向关联 比如一本书有多个作者,一个作者有多本书,想查书的时候带上所有作者信息:
queryset = Book.objects.prefetch_related('authors').all()
for book in queryset:
for author in book.authors.all(): # 这里不会产生额外查询
print(author.name)
情况三:混合使用 如果模型关系复杂,可以组合使用:
queryset = Order.objects.select_related('customer').prefetch_related('products')
情况四:自定义复杂查询 需要跨表过滤时,可以用双下划线:
queryset = ModelA.objects.filter(
b_field__c_field__name='some_value'
).select_related('b_field__c_field')
情况五:原始数据聚合
如果只需要部分字段,可以用values或values_list:
data = ModelA.objects.values(
'field1',
'b_field__field2',
'b_field__c_field__field3'
)
关键就看你表之间是怎么关联的,选对方法就行。
flask 里面可以多个 outerjoin 串联 实现多表查询
emm union ?
django 里面你应该是通过 model 的关系来查询,如果你真想一次查,那就只能写 join
第一种办法
1 分别查询
2 用 chains 连接起来
3 如果是 drf,建个自定义 serializer 序列化
------
第二种
重新抽象 model,
看业务需求用 proxy 模式或者直接用字段表示不同的类型,再分别 filter 出去
多谢各位,现在用 union 解决了这个问题,官方文档里也有介绍
union (* other_qs,all = False )
使用 SQL 的 UNION 运算符来组合两个或多个 QuerySets 的结果 。例如:
>>> qs1.union(qs2, qs3)
https://docs.djangoproject.com/en/1.11/ref/models/querysets/#django.db.models.query.QuerySet.union
关联查询 套两层


