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