Как использовать переменные в качестве имен полей для динамического обновления объектов в Django

в приведенной ниже модели в приложении Django есть три поля, просто для примера.

    class MyModel(models.Model):

        field1 = models.IntegerField(default=0, blank=False,null=False)
        field2 = models.IntegerField(default=0, blank=False,null=False)
        field3 = models.IntegerField(default=0, blank=False,null=False)

Для обновления нескольких полей я хочу использовать переменную "target_field" вместо использования каждого имени поля.

    for i in (1,3):
        target_field = "field{0}".format(i)
        
        sample_object = get_object_or_404(MyModel, id=sample_d)
        sample_object.target_field = "sample_value" # this couldn't work.
        sample_object.save()

В описанном выше коде "target_field" не распознается как имя поля.

Вы можете попробовать использовать exec(), чтобы обойти это.

exec(sample_object+"."+target_field+"='sample value'")

Это должно работать, если sample_object и target_field являются строками и объект создается в main. Я использовал этот метод для динамической установки значений переменным в некоторых из моих предыдущих проектов.

Вы можете установить поле модели так же, как и любой другой атрибут класса:

for i in (1,3):
    target_field = "field{0}".format(i)
    sample_value = some_list[i]
        
    sample_object = get_object_or_404(MyModel, id=sample_d)
    setattr(sample_object, target_field, sample_value)
    sample_object.save()
Вернуться на верх