9
请问 Django ORM 如何实现 left join?
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.
- 原始 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 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 语句搞定。
像这个语句,如果要尽可能使用 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 9 小时 47 分钟前 via Android
我用 orm 僅限 inner join
其他用法一律寫 sql
強行用 orm 有時候可讀性反而差
其他用法一律寫 sql
強行用 orm 有時候可讀性反而差
ila 5 小时 11 分钟前 via Android
roundgis 4 小时 48 分钟前 via Android
neoblackcap 2 小时 50 分钟前
抱歉,Django ORM 没有 Left Join
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK