djano "and" "or" 在同一ORM 语句中的应用
By:Roy.LiuLast updated:2012-09-28
在改造一套系统时,发现原来的SQL语句条件中混合了 AND 与 or 。如果用原生的 SQL 语句肯定是很好解决的事情,所以就不考虑用 DJANGO 的RAW SQL 来实现,如果用这个实现,比较简单,可以参考写过的一篇文章:原生SQL 返回字典
在这里打算用 orM 来实现,因为条件并不复杂,也不涉及很多表的关联查询。
经过测试,对于这种既有AND 又有 or ,还得注意关系的语句,可以通过多个filter 来实现。
比如如下例子:
在这个例子中,其实可以看到用了两个filter:
前面一个filter 表示 name like '%summer%' and district='SH'
后面一个filter 表示 sysowner='SUMMER' or userlist like '%SUMMER%'
如果你开启 MYSQL 跟踪语句的话,会发现,django orm 会生成类似如下的SQL 语句:
这样,会自动给OR 关系的前后加上括号,这样SQL语句就没有问题了。
在这里打算用 orM 来实现,因为条件并不复杂,也不涉及很多表的关联查询。
经过测试,对于这种既有AND 又有 or ,还得注意关系的语句,可以通过多个filter 来实现。
比如如下例子:
row=models.Plan.objects.filter(name__icontains='SUMMER',district='SH').filter(Q(sysowner='SUMMER') | Q(userlist__icontains='SUMMER'))
在这个例子中,其实可以看到用了两个filter:
前面一个filter 表示 name like '%summer%' and district='SH'
后面一个filter 表示 sysowner='SUMMER' or userlist like '%SUMMER%'
如果你开启 MYSQL 跟踪语句的话,会发现,django orm 会生成类似如下的SQL 语句:
select name,district... from plan where name like '%summer%' and district='SH' and (sysowner='SUMMER' or userlist like '%SUMMER%')
这样,会自动给OR 关系的前后加上括号,这样SQL语句就没有问题了。
From:一号门
Previous:django模板中得到request 的各种信息
COMMENTS