V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
wuwukai007
V2EX  ›  Python

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

  •  
  •   wuwukai007 · 2020-11-15 18:29:01 +08:00 · 1649 次点击
    这是一个创建于 1454 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如

    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 写出来的

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

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

    这个实现还是挺骚气的,

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

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


    关于 django,drf 的,文档和源码之前也都撸过,
    如果一般提问没思路,也可以 at 我,我还是挺喜欢各种 pythonic 的实现
    freakxx
        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

    看看,依瓢画葫芦还是挺简单的事。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   970 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 20:00 · PVG 04:00 · LAX 12:00 · JFK 15:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.