2016-08-11 3 views
0

Я использую ниже код для обновления статуса.Как обновить объект модели в django?

current_challenge = UserChallengeSummary.objects.filter(user_challenge_id=user_challenge_id).latest('id') 
current_challenge.update(status=str(request.data['status'])) 

Я получаю ниже ошибок:

'UserChallengeSummary' object has no attribute 'update'

Для решения этой ошибки: Я нашел решение:

current_challenge.status = str(request.data['status']) 
current_challenge.save() 

Есть ли другой способ обновить запись?

+0

Насколько я знаю, ваше решение является обычным для django – Compadre

ответ

0

latest() метод возвращает последний объект, который является экземпляром UserChallengeSummary, который не имеет метода обновления.

Для обновления отдельных объектов ваш метод является стандартным.

update() метод используется для одновременного обновления нескольких объектов, поэтому он работает на экземплярах QuerySet.

1

Ваше рабочее решение - это способ, обычно используемый в 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() из функции (назвать его явным после вызова функции).

+0

Спасибо за быстрый ответ. Я определенно использую ваше решение для решения моей проблемы. –

+0

Я бы предпочел вам взглянуть на «сырой» способ Django обновить модели еще раз - это очень хорошо использовать. Я использую приведенный выше код только для того, чтобы сократить количество моих сокращений. –

+0

Да, мы можем использовать необработанный запрос. Но было бы легко, если мы сможем использовать запрос ORM. –

Смежные вопросы