models.Modelの特定のフィールドのみを更新します


92

私はモデルを持っています

class Survey(models.Model):
    created_by = models.ForeignKey(User)
    question = models.CharField(max_length=150)
    active = models.NullBooleanField()
    def __unicode__(self):
        return self.question

そして今、私はactiveフィールドだけを更新したいと思います。だから私はこれを行います:

survey = get_object_or_404(Survey, created_by=request.user, pk=question_id)
survey.active = True
survey.save(["active"]) 

エラーが発生しましたIntegrityError: PRIMARY KEY must be unique

この方法で更新するのは正しいですか?

回答:


186

フィールドのサブセットを更新するには、次を使用できますupdate_fields

survey.save(update_fields=["active"]) 

update_fields引数はDjangoの1.5で追加されました。以前のバージョンでは、update()代わりに次の方法を使用できました。

Survey.objects.filter(pk=survey.pk).update(active=True)

17

通常、1つ以上のモデルインスタンスの特定のフィールドを更新する正しい方法はupdate()、それぞれのクエリセットでメソッドを使用することです。次に、次のようなことを行います。

affected_surveys = Survey.objects.filter(
    # restrict your queryset by whatever fits you
    # ...
    ).update(active=True)

このように、save()モデルは自動的に保存されるため、モデルを呼び出す必要はありません。また、このupdate()メソッドは、更新によって影響を受けた調査インスタンスの数を返します。


2
ありがとう。.get代わりに試してみましたが.filter、うまくいきません。しかし、フィルターを使用するとうまく機能します。上記の私のコードの何が問題になっているのか知っていますか?
登録ユーザー

あなたの問題はに関連している可能性がありますquestion_id。この値はどこから来るのですか?そして、どの正確な線が上昇しIntegrityErrorますか?
pemistahl 2012

question_idURLから来ています(?P<question_id>\d+)。私のせいは、動作中のサーバーにdjango 1.4がインストールされていて、コードが1.5であるということでした。しかし、あなたのコードではそれはうまく機能しています。
登録ユーザー

2
@RegisteredUserは、クエリセットだけで、オブジェクトに「更新」メソッドがないように見えます。.filter()を使用すると、クエリセット(0個以上のオブジェクトを保持)が返されます。.get()を使用すると、単一のオブジェクトを取得します。
mgojohn 2014

デフォルトでは、save()(@ Alasdairソリューション)を呼び出す方が安全なソリューションです。このメソッドは、検証やカスタムコードなどをトリガーする可能性があるupdate()ためです。
デビッド・D.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.