Python中Django如何一次查询3张表?

3 张表里的字段名一致

我在 Googld 搜索的结果都是查询 2 张表的

请问如何一次查多张表呢?


Python中Django如何一次查询3张表?
9 回复

join 操作?没有外键请直接用 raw 写 sql


在Django里一次查三张表,最直接的就是用select_relatedprefetch_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')

情况五:原始数据聚合 如果只需要部分字段,可以用valuesvalues_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

关联查询 套两层

回到顶部