Django queryset排除正则表达式

时间:2016-04-29 11:35:06

标签: python django django-queryset

我有一个过滤请求的命令,我需要按照两个规则提取其中一些。

应该

include '^https?:\/\/[^.]*\.?site\.co([^?]*[?]).*utm_.*$'
or
exclude '^https?:\/\/[^.]*\.?site\.([^\/]+\/)*'

因此,在编写可能的SQL表示时,我提出了:

exclude (
   matching '^https?:\/\/[^.]*\.?site\.([^\/]+\/)*'
   and
   not matching '^https?:\/\/[^.]*\.?site\.co([^?]*[?]).*utm_.*$'
)

将django翻译为:

.exclude(
   Q(referer__iregex=r'^https?:\/\/[^.]*\.?site\.co([^?]*[?]).*utm_.*$') &
   Q(referer__not_iregex=r'^https?://[^.]*\.?site\.[^/]+/?[\?]*$'))

但不幸的是,__not_iregex查找并不存在。什么可以解决这个问题?

1 个答案:

答案 0 :(得分:2)

您实际上可以使用filter作为您不想排除的部分:

queryset
    .filter(referer__iregex=r'^https?://[^.]*\.?site\.[^/]+/?[\?]*$')
    .exclude(referer__iregex=r'^https?:\/\/[^.]*\.?site\.([^\/]+\/)*')

所以,matching进入excludenot matching进入filter

如果您真的想模仿SQL表示中的内容,可以使用~Q

.exclude(
   Q(referer__iregex=r'^https?:\/\/[^.]*\.?site\.([^\/]+\/)*') &
   ~Q(referer__iregex=r'^https?://[^.]*\.?site\.[^/]+/?[\?]*$'))
   # notice use of ~ here