Как установить имя поля Dynami c в функции objects.get () - PullRequest
0 голосов
/ 12 февраля 2020

Я хочу создать миксин, который позволяет мне изменять поле функции get следующим образом:

class MyMixin(self):

    myfield = 'field1' 

    def myfunct(self):

        i = MyModel.objects.get(self.myfield=myvar)

, чтобы требуемый код выполнялся MyModel.objects.get(field1=myvar).

Однако этот подход возвращает

SyntaxError: выражение не может содержать присваивание

Как я могу динамически устанавливать имена полей, такие как?

Ответы [ 2 ]

5 голосов
/ 12 февраля 2020

Вы можете сделать это так:

kwargs = {self.myfield: myvar}
MyModel.objects.get(**kwargs)
0 голосов
/ 12 февраля 2020

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] :

        &hellip;
        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):
    # &hellip;

    def __init__(self, *args, _connector=None, _negated=False, **kwargs):
        super().__init__(children=[*args, <b>*sorted(kwargs.items()</b>)], connector=_connector, negated=_negated)

поэтому, используя 2-кортеж в объекте Q, мы создаем, так сказать, «ярлык».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...