Можно ли изменить объекты Django Q() после создания?
Можно ли изменить объекты Django Q() после создания? Я создаю объект Q () примерно так:
q = Q(foo=1)
возможно ли позже изменить q
быть таким же, как если бы я построил:
q2 = Q(foo=1, bar=2)
? Там нет упоминания о таком интерфейсе в документации Django, который я мог найти.
Я искал что-то вроде:
Q.append_clause(bar=2)
3 ответа
Вы можете просто сделать еще один объект Q() и AND их вместе:q2 = q & Q(bar=2)
Вы можете добавить объекты Q вместе, используя их add
метод. Например:
>>> q = Q(sender=x)
>>> q.add(Q(receiver=y), Q.AND)
Второй аргумент add
это разъем, который также может быть Q.OR
РЕДАКТИРОВАТЬ: Мой ответ просто другой способ сделать то, что предложил Перрин Харкинс, но в отношении вашего другого беспокойства, о другом поведении filter
в зависимости от способа построения запроса вам не нужно беспокоиться об этом, если вы присоединяетесь к объектам Q. Мой пример эквивалентен filter(sender=x, receiver=y)
, и не filter(sender=x).filter(receiver=y)
потому что объекты Q, насколько я мог видеть в быстром тесте, выполняют немедленное И для предложений и не имеют особого поведения filter
для многозначных отношений.
В любом случае, нет ничего лучше, чем посмотреть на SQL и убедиться, что он действительно делает то же самое в ваших конкретных запросах.
Ответы здесь немного устарели и неудовлетворительны. Итак, вот мой ответ
Вот как вы глубоко копируете:
def deep_copy(q: Q) -> Q:
new_q = Q()
# Go through the children of a query: if it's another
# query it will run this function recursively
for sub_q in q.children:
# Make sure you copy the connector in
# case of complicated queries
new_q.connector = q.connector
if isinstance(sub_q, Q):
# This will run recursively on sub queries
sub_q = get_employee_q(sub_q)
else:
pass # Do your modification here
new_q.children.append(sub_q)
return new_q
В другом условии ваши вещи (
name='nathan'
например) определяется. Вы можете изменить или удалить это, если хотите, и запрос должен работать нормально.