如何更新django中的模型对象?

时间:2016-08-11 11:03:53

标签: python django django-models

我使用下面的代码来更新状态。

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

我收到以下错误:

  

'UserChallengeSummary'对象没有属性'update'

解决此错误: 我找到了解决方案:

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

还有其他方法可以更新记录吗?

2 个答案:

答案 0 :(得分: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()(在函数调用后调用它)。

答案 1 :(得分:0)

latest()方法返回最新的对象,该对象是UserChallengeSummary的实例,没有更新方法。

为了更新单个对象,您的方法是标准的。

update()方法用于一次更新多个对象,因此它适用于QuerySet个实例。