9

请问 Django ORM 如何实现 left join?

 2 years ago
source link: https://www.v2ex.com/t/847701
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

V2EX  ›  Django

请问 Django ORM 如何实现 left join?

  ila · 11 小时 19 分钟前 · 346 次点击
  • 原始 sql 语句如下:
select be.id, be.fullName1, be.workEmail
from employees as be
         left join id_mapping as ci
                   on be.id = ci.user_id
where be.id like '%Steven%'
   or be.fullName1 like '%Steven%'
   or be.workEmail like '%Steven%'
   or ci.new_id like '%Steven%'
group by be.id

  • 研究了一下午,暂无头绪.先用 raw 运行着 sql 语句.
  • 请各位出手相助.
6 条回复    2022-04-19 01:31:24 +08:00

lybcyd

lybcyd      9 小时 50 分钟前

django orm 和其他 orm 都不太一样,是不能直接使用 query builder 进行 join 的。后面的 group by 也不方便直接用,不过你这个语句 id 应该是 unique 的,又是非标准的 full group 语法,先忽略掉吧。

像这个语句,如果要尽可能使用 django orm 的推荐做法,应该建一个 IdMapping 的 model ,然后建立一对多或者一对一的关联关系(看你的业务逻辑)。这个关联关系可以直接当做一个 field 获取,也可以在条件里进行 lookup 。假设在 Employee model 里,这个关联关系叫做 mapping ,就可以直接使用 Employee.objects.filter(Q(id__icontains='Steven')|Q(fullName1__icontains='Steven')|Q(workEmail__icontains='Steven')|Q(mapping__new_id__icontains='Steven')).values('id','fullName1', 'workEmail')
来进行查询了。

看看官方文档是怎么定义的:

https://docs.djangoproject.com/zh-hans/4.0/topics/db/models/#many-to-one-relationships

https://docs.djangoproject.com/zh-hans/4.0/topics/db/queries/#lookups-that-span-relationships-1

如果 join 关系实在太复杂,用自带的很难拼接,那就干脆 raw 来实现。ORM 不是万能的,拼接一大堆复杂的条件还不如直接 sql 语句搞定。

roundgis

roundgis      9 小时 47 分钟前 via Android

我用 orm 僅限 inner join

其他用法一律寫 sql

強行用 orm 有時候可讀性反而差

ila

ila      5 小时 13 分钟前 via Android

@lybcyd 谢谢你的回复。
之前类似的例子。以为太复杂。
现在看来,还得动手写一遍。

ila

ila      5 小时 11 分钟前 via Android

@roundgis 是的。
因为之前用 flask 时,sqlalchemy 很容易实现 left join 。
想在 Django 里也实现,结果看来还得按照官方的教程来,就是复杂些了。

roundgis

roundgis      4 小时 48 分钟前 via Android

@ila django orm 沒法和 sqlalchemy 比

你也可以兩個混用

用 django 來建模 用 sqlalchemy 來做複雜的查詢

neoblackcap

neoblackcap      2 小时 50 分钟前

抱歉,Django ORM 没有 Left Join

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK