Ваше рабочее решение - это способ, обычно используемый в Django, поскольку @Compadre уже сказал.
Но иногда (например, в тестах) полезно иметь возможность обновлять сразу несколько полей. Для таких случаев, я написал простой помощник: пример
def update_attrs(instance, **kwargs):
""" Updates model instance attributes and saves the instance
:param instance: any Model instance
:param kwargs: dict with attributes
:return: updated instance, reloaded from database
"""
instance_pk = instance.pk
for key, value in kwargs.items():
if hasattr(instance, key):
setattr(instance, key, value)
else:
raise KeyError("Failed to update non existing attribute {}.{}".format(
instance.__class__.__name__, key
))
instance.save(force_update=True)
return instance.__class__.objects.get(pk=instance_pk)
Использования:
current_challenge = update_attrs(current_challenge,
status=str(request.data['status']),
other_field=other_value)
# ... etc.
Если вы с, вы можете удалить instance.save()
из функции (назвать его явным после вызова функции).
Насколько я знаю, ваше решение является обычным для django – Compadre