2016-04-29 21 views
1

私はリクエストをフィルタリングするコマンドを持っていますが、2つのルールに従ってそれらのいくつかを抽出する必要があります。 、Django queryset正規表現を除外

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

しかし、残念なことに:

にジャンゴに変換
exclude (
    matching '^https?:\/\/[^.]*\.?site\.([^\/]+\/)*' 
    and 
    not matching '^https?:\/\/[^.]*\.?site\.co([^?]*[?]).*utm_.*$' 
) 

それはず

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

は、可能なSQL表現をワークアウト、私が思い付きました__not_iregexルックアップが存在しません。これを回避する方法は何ですか?

+0

は、あなたが他のためのものと 'exclude'のための' filter'を使用しようとしています。それは 'not 'の部分でうまくいくかもしれません。確かに、あなたはまた、否定を正規表現自体に移します。 – schwobaseggl

答えて

2

あなたは実際にあなたが除外したくない部分がfilterを使用することができます。

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

だからここにあなたのmatchingexcludeに入り、not matchingfilterに入ります。

それともあなたは本当にあなたがSQL表現に持っているもの真似したい場合は、~Qを使用することができます。

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