django ORM 使用 sql 函数怎么写表达式?

2020-11-15 18:29:01 +08:00
 wuwukai007

比如

sql = select * from book where left('name',1)!='z'

用 orm 我目前只能想到

book.objects.extra(where=["left('name',1)!='z' "])

或者

from django.db.mdels.functions import Left

book.objects.annotate(name_left=Left('name',1)).filter(~Q(name_left='z'))

第一种要写原生 sql,第二种不写原生 sql,但是 白白加了一个 name_left 字段, 有没有这种使用了 sql 函数,还能做判断的 ,通过 ORM 写出来的

1655 次点击
所在节点    Python
6 条回复
nonduality
2020-11-15 19:06:20 +08:00
对于你这个情形,用 book.objects.exclude(name__startswith='z')就可以实现
wuwukai007
2020-11-15 19:10:19 +08:00
@nonduality left 只是举个例子,实际情况里面可能用别的函数 instr 等,只是想探讨下 对于这种 带函数的,能不能 写出表达式,!= ,= 。
freakxx
2020-11-15 19:21:42 +08:00
Custom Lookups
https://docs.djangoproject.com/zh-hans/3.1/howto/custom-lookups/

直接定义个新的规则就 ok
wuwukai007
2020-11-15 19:31:17 +08:00
@freakxx orm 还可以自定义规则,看来还是文档看的不够细,多谢
freakxx
2020-11-15 19:39:11 +08:00
@wuwukai007 #4

这个实现还是挺骚气的,

你提的点我也刚才也去看能不能实现,
实际上可以想办法做成 substrwith 这样的东西,但官方好像不支持动态名字,
比如 substrwith__<int> 来动态改变,

所以你可以考虑先做个比较简单的,比如 stat 呀,end 之类还是比较简单的


关于 django,drf 的,文档和源码之前也都撸过,
如果一般提问没思路,也可以 at 我,我还是挺喜欢各种 pythonic 的实现
freakxx
2020-11-15 19:43:01 +08:00
对应源码可以去
django/db/models/lookups.py

https://github.com/django/django/blob/master/django/db/models/lookups.py

看看,依瓢画葫芦还是挺简单的事。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/725499

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX