Можно ли изменить объекты 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'например) определяется. Вы можете изменить или удалить это, если хотите, и запрос должен работать нормально.

Другие вопросы по тегам