Подготовьте строковое представление команды и затем выполните id - PullRequest
0 голосов
/ 19 июня 2019

Джанго == 2.2.2

Теперь у меня есть этот код:

Модель

class YandexResponse(models.Model):
    time = models.DateTimeField(auto_now=True)
    campaigns = models.TextField()
    ad_groups = models.TextField()
    ads = models.TextField()
    keywords = models.TextField()
    sitelinks = models.TextField()

View

yandex_response_record, created = YandexResponse.objects.get_or_create(id=1)

if what_to_update == "campaigns":
    yandex_response_record.campaigns=json.dumps(data)
    yandex_response_record.save()
elif what_to_update == "ad_groups":
    yandex_response_record.ad_groups=json.dumps(data)
    yandex_response_record.save()
...

Я бы хотел что-то вроде:

tmp = "yandex_response_record.{}=json.dumps(data)".format(what_to_update)
execute(tmp);
yandex_response_record.save()

Не могли бы вы сказать, возможно ли это? Если это невозможно, не могли бы вы предложить мне какое-нибудь элегантное решение здесь?

Ответы [ 2 ]

0 голосов
/ 19 июня 2019

Для этого вы можете использовать функцию setattr , как указано в документах .

'setattr' является аналогом getattr (). Аргументами являются объект, строка и произвольное значение. Строка может называть существующий атрибут или новый атрибут.

Таким образом, вместо проверки значения переданного поля, вы можете сделать:

yandex_response_record, created = YandexResponse.objects.get_or_create(id=1)
setattr(yandex_response_record, what_to_update, json.dumps(data))
yandex_response_record.save()

Он обновляет имя поля, указанное в what_to_update, как указано в json.dumps(data).

Может быть, это будет полезно для вас.

0 голосов
/ 19 июня 2019

Вы ищете встроенную функцию setattr.

setattr(yandex_response_record, what_to_update, json.dumps(data))
yandex_response_record.save()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...