2016-04-29 13 views
1

Ich habe einen Befehl, der Anforderungen durchsucht, und ich muss einige von ihnen nach zwei Regeln extrahieren.Django-Queryset exclude regex

Es sollte

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

So eine mögliche SQL Darstellung ausarbeitet, kam ich mit:

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

übersetzen, die in django zu:

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

Aber leider, Die __not_iregex Suche existiert nicht. Was könnte das Problem umgehen?

+0

Haben Sie versucht, mit 'filter' für ein und' exclude' für den anderen. Das könnte um den "Nicht-Teil" funktionieren. Sicherlich verschiebst du auch die Negation in die Regex selbst. – schwobaseggl

Antwort

2

Sie könnte in der Tat filter für den Teil benutzen, die Sie wollen nicht ausschließen: So

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

hier Ihre matching geht in exclude und not matching geht in filter.

Oder Sie könnten die ~Q verwenden, wenn Sie wirklich nachahmen wollen, was Sie in der SQL-Darstellung haben:

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