【发布时间】:2019-05-29 11:44:35
【问题描述】:
我前端的用户可以像这样在我的模型的 id 上提交任意嵌套查询字符串
querystring="(driver = 1 AND routes = 3) OR ( driver = 2 AND weather = 1 )"
我想在后端使用djangos complex Q函数来查询这个字符串,这意味着我需要把querystring变成类似
的东西criterion = \
(Q(detail__drivers=1) & Q(routes =3) ) | (Q(detail__driver=2) & Q(detail__weather=1) )
为了能够过滤使用
self.queryset.filter(criterion)
但是如何在保持括号结构的同时自动将字符串翻译成标准呢?
【问题讨论】:
-
你需要编写一个解析器,它可以理解 ()、AND 和 OR 的分组。看this
-
为什么要使用
Q,是不是可以简单的使用self.queryset.filter(detail__drivers__id__in=[1], routes__id__in=[3], detail__driver__id__in=[2], detail__weather__id__in=[1])?? -
这样你会失去 AND/OR 逻辑
-
当所有值都是单一的时,不确定为什么要使用
__in。为什么不detail__drivers=1 & routes__id=3等? -
@DanielRoseman 你当然是对的
标签: python sql django django-models