Можно ли ссылаться на поле в Django, используя скобки? - PullRequest
1 голос
/ 09 апреля 2020

Здравствуйте. Я пытаюсь проверить, есть ли возможность ссылаться на модель в Django, используя скобки

//model
class User(model.Model):
   firstname = models.charField()

//referencing

    user = User.objects.get(id=1)


   //original reference
    user.firstname = "John"


   // proposed reference
     user["firstname"] = "John"

Возможно ли это или есть альтернатива предложенной ссылке

Ответы [ 2 ]

3 голосов
/ 09 апреля 2020

Вы можете реализовать __getitem__ и __setitem__ в вашей модели, которые затем вызывают getattr(..) и setattr(..). Например, вы можете исправить это в классе Model:

from django.db.models import Model

Model.__getitem__ = lambda x, y: getattr(x, y)
Model.__setitem__ = lambda x, y, v: setattr(x, y, v)

Но обычно это , а не - хорошая идея иметь два способа достижения чего-либо sh. Как указано в Дзэн Python:

Должен быть один - и предпочтительно только один - очевидный способ сделать это.

Если вы хотите изменить атрибут на основе строки, содержащей имя, вы можете просто реализовать это с помощью:

<b>setattr(</b>user, 'firstname', 'John'<b>)</b>
1 голос
/ 09 апреля 2020

Если цель состоит в том, чтобы обновить объект на основе словаря пар ключ / значение, тогда вам не нужна запись :

  • Любое использование setattr:
    setattr(user, key, value)
    
    установит для атрибута key значение value, поэтому, если key = 'firstname' это то же самое, что user.firstname = value.
  • Или обновите объект непосредственно в базе данных. Предполагая, что ваш словарь пар ключ / значение соответствует полям, которые вы хотите обновить:
    User.objects.filter(id=1).update(**kwargs)
    
    непосредственно сохранит объект. Например, если kwargs равно {'firstname': 'John'}, он просто обновит имя. Только будьте осторожны, чтобы ваше выражение filter() соответствовало нужному объекту, который вы хотите обновить.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...