4

特定のモデルの一連のオブジェクトを照会し、単一の属性/列 (「アカウント」) を変更してから、クエリセットのオブジェクト全体を新しいオブジェクト/行として保存する必要があります。言い換えれば、複製で単一の属性 (「アカウント」) を変更して、オブジェクトを複製したいと考えています。基本的に、新しいアカウントを作成してから、各モデルを調べて、以前のアカウントのオブジェクトを新しいアカウントにコピーするので、おそらく django シェルを使用して、さまざまなモデルでこれを繰り返します。これにどのようにアプローチすればよいですか?クエリセット レベルで実行できますか、それともすべてのオブジェクトをループする必要がありますか?

つまり、

MyModel.objects.filter(account="acct_1")
# Now I need to set account = "acct_2" for the entire queryset, 
# and save as new rows in the database
4

1 に答える 1

7

ドキュメントから:

オブジェクトの主キー属性が設定されていない場合、または設定されていてもレコードが存在しない場合、Django は INSERT を実行します。

したがって、idまたはpkをNoneに設定すると機能するはずですが、SOでこのソリューションに対する競合する応答を見てきました: Duplicating model instances and their related objects in Django / Algorithm for recursively duplicate an object

この解決策は機能するはずです(修正してくれた@JoshSmeatonに感謝します):

models = MyModel.objects.filter(account="acct_1")
for model in models:
  model.id = None
  model.account = "acct_2"
  model.save()

私の場合、OneToOneFieldテストしているモデルに があると思うので、この基本的なソリューションではテストが機能しないのは理にかなっています。しかし、OneToOneField の面倒を見る限り、うまくいくと思います。

于 2013-04-22T14:44:35.227 に答える