Объекты Django, не имеющие подписки, заставляют меня писать избыточный код - PullRequest
2 голосов
/ 21 января 2012

Объекты Django не являются «подписными», что означает, что если у вас есть user.name, вы не можете определить его с помощью user['name'], что означает, что вы не можете динамически загружать объект информацией.вызывает TypeError: 'User' object is not subscriptable, и я нахожу себя пишущим код, подобный

info = {'first_name': 'Artur', 'last_name': 'Sapek'}

if 'first_name' in info: me.first_name = info['first_name']
if 'last_name' in info: me.first_name = info['last_name']
so on...

(он также требует операторов if, потому что там больше информации и она не всегда полная - это не мой настоящий код)1010 *

Есть ли лучший способ сделать это с объектами Django, у которых нет возможности использовать скобочные обозначения, как вы можете использовать со списками, диктовками и строками?

Ответы [ 2 ]

11 голосов
/ 21 января 2012

setattr - это то, что вы ищете.

В вашем случае вы могли бы сделать что-то вроде этого:

for attr, value in info.items():
    setattr(me, attr, value)
8 голосов
/ 21 января 2012

Почему бы не сделать следующее:

info = {'first_name': 'Artur', 'last_name': 'Sapek'}
user = User(**info)

Конечно, если вы используете модель contrib.auth User, вам нужно будет заполнить обязательные поля.

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