2016-08-11 9 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

@Compadreはすでに言ったように、あなたの作業ソリューションはDjangoで通常使用される方法です。

しかし、(テストなどの)場合によっては、複数のフィールドを一度に更新できることがあると便利です。このような場合のために私は、単純なヘルパーを書いた:

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クエリを使用することができれば簡単です。 –

関連する問題