2-кортеж можно передать объекту Q
[Django -doc] с ключом и значением:
from django.db.models import <b>Q</b>
MyModel.objects.get(<b>Q((self.myfield, myvar))</b>)
Например, мы можем сгенерировать запрос для .filter(..)
:
>>> print(MyModel.objects.filter(Q(('id', 1))).query)
SELECT `test_mymodel`.`id` FROM `test_mymodel` WHERE `test_mymodel`.`id` = 1
Фактически, если вы посмотрите, как Django обрабатывает позиционные и именованные параметры .get(..)
и .filter(..)
, делает объект Q
[GitHub] :
…
clone = self._chain()
if negate:
clone.query.add_q(~Q(*args, **kwargs))
else:
clone.query.add_q(Q(*args, **kwargs))
return clone
, а именованные параметры преобразуются в (отсортировано) 2- кортежи :
class Q(tree.Node):
# …
def __init__(self, *args, _connector=None, _negated=False, **kwargs):
super().__init__(children=[*args, <b>*sorted(kwargs.items()</b>)], connector=_connector, negated=_negated)
поэтому, используя 2-кортеж в объекте Q, мы создаем, так сказать, «ярлык».