Я пытаюсь построить сложный запрос в Django, добавив объекты Q на основе списка пользовательских входов:
from django.db.models import Q
q = Q()
expressions = [
{'operator': 'or', 'field': 'f1', 'value': 1},
{'operator': 'or', 'field': 'f2', 'value': 2},
{'operator': 'and', 'field': 'f3', 'value': 3},
{'operator': 'or', 'field': 'f4', 'value': 4},
]
for item in expressions:
if item['operator'] == 'and':
q.add(Q(**{item['field']:item['value']}), Q.AND )
elif item['operator'] == 'or':
q.add(Q(**{item['field']:item['value']}), Q.OR )
Исходя из этого, я ожидаю получить запрос со следующим условием:
f1 = 1 or f2 = 2 and f3 = 3 or f4 = 4
который на основе приоритета оператора по умолчанию будет выполняться как
f1 = 1 or (f2 = 2 and f3 = 3) or f4 = 4
однако, я получаю следующий запрос:
((f1 = 1 or f2 = 2) and f3 = 3) or f4 = 4
Похоже, что объект Q() заставляет условия оцениваться в том порядке, в котором они были добавлены.
Есть ли способ сохранить приоритет SQL по умолчанию? В основном я хочу сказать ORM не добавлять скобки в мои условия.