回答:
queryset オブジェクトupdate
メソッドを使用します。
MyModel.objects.filter(pk=some_value).update(field1='some value')
update
メソッドは大量更新には最適ですが、使用すると、手動で起動する必要がある可能性のある、そのオブジェクトに接続されている信号を確認する必要があるという警告が
MyModel.objects.filter(pk=some_value).update(field1=self.data)
Djangoデータベースオブジェクトは、オブジェクトの作成と変更に同じsave()メソッドを使用します。
obj = Product.objects.get(pk=pk)
obj.name = "some_new_value"
obj.save()
DjangoがUPDATEとINSERTを認識する方法
オブジェクトの主キー属性がTrueと評価される値(つまり、Noneまたは空の文字列以外の値)に設定されている場合、DjangoはUPDATEを実行します。オブジェクトの主キー属性が設定されていない場合、またはUPDATEが何も更新しなかった場合、DjangoはINSERTを実行します。
参照:https : //docs.djangoproject.com/en/1.9/ref/models/instances/
この回答は、上記の2つのアプローチを比較しています。1行で多くのオブジェクトを更新する場合は、次のようにします。
# Approach 1
MyModel.objects.filter(field1='Computer').update(field2='cool')
それ以外の場合は、クエリセットを反復処理して個々のオブジェクトを更新する必要があります。
#Approach 2
objects = MyModel.objects.filter(field1='Computer')
for obj in objects:
obj.field2 = 'cool'
obj.save()
アプローチ1は、「n + 1」データベースクエリを作成するアプローチ2と比較して、データベースクエリを1つだけ作成するため、より高速です。(クエリセットのnアイテムの場合)
最初のアプローチは1つのdbクエリ、つまりUPDATEを作成し、2番目のアプローチはSELECTとUPDATEの2つを作成します。
トレードオフは、更新updated_on
やそのような関連フィールドなどのトリガーがある場合、直接更新、つまりアプローチ1ではトリガーされないことです。
アプローチ1はクエリセットで使用されるため、アプローチ2の場合ではなく、一度に複数のオブジェクトを更新できます。
ある場合にのみ、serializer
非常に簡単な方法で更新できます!
my_model_serializer = MyModelSerializer(
instance=my_model, data=validated_data)
if my_model_serializer.is_valid():
my_model_serializer.save()
form
物事の場合にのみ!
instance = get_object_or_404(MyModel, id=id)
form = MyForm(request.POST or None, instance=instance)
if form.is_valid():
form.save()
Django form
、ジャンゴプロパーからです。
update
このような方法を使用すると、そのモデルまたは他の「コード」に関連付けられている信号はオブジェクトに対して実行されません。火傷した人からのポインタ:)