比如
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 写出来的
1
nonduality 2020-11-15 19:06:20 +08:00
对于你这个情形,用 book.objects.exclude(name__startswith='z')就可以实现
|
2
wuwukai007 OP @nonduality left 只是举个例子,实际情况里面可能用别的函数 instr 等,只是想探讨下 对于这种 带函数的,能不能 写出表达式,!= ,= 。
|
3
freakxx 2020-11-15 19:21:42 +08:00
|
4
wuwukai007 OP @freakxx orm 还可以自定义规则,看来还是文档看的不够细,多谢
|
5
freakxx 2020-11-15 19:39:11 +08:00
@wuwukai007 #4
这个实现还是挺骚气的, 你提的点我也刚才也去看能不能实现, 实际上可以想办法做成 substrwith 这样的东西,但官方好像不支持动态名字, 比如 substrwith__<int> 来动态改变, 所以你可以考虑先做个比较简单的,比如 stat 呀,end 之类还是比较简单的 关于 django,drf 的,文档和源码之前也都撸过, 如果一般提问没思路,也可以 at 我,我还是挺喜欢各种 pythonic 的实现 |
6
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 看看,依瓢画葫芦还是挺简单的事。 |