3

データベースからすべてのオブジェクトを取得し、それらを python foreach ループで反復処理すると、ループ内のすべてのオブジェクトが削除されます。顧客オブジェクトとしてまだメモリ内にある、削除されたデータベース エントリはどうなるか

for cust in Customer.objects.all():
   #delete all
   for cust2 in Customer.objects.all():
      cust2.delete()

   #what is cust now??
   cust.save() # is this valid?

各顧客の反復ごとに値をすぐに更新することは可能でしょうか? そのため、cust1 の処理中に cust2 を削除し、次の繰り返しでは cust2 の処理を​​開始しません...次のように想像してください。

   for cust in Customer.objects.all():
       if cust.pay_everyone():
           for cust2 in Customer.objects.all(): 
               cust2.paid = True
               cust2.save()

       #when cust2 comes in the loop, cust2.paid is still False
       #the previous pay_everyone() method is undone
       if cust.kill_everyone():
           for cust2 in Customer.objects.all(): 
               cust2.delete()

       #when cust2 comes in the loop, he is still alive when he should be dead
       cust.save()
       # in cust2's turn in the loop, he has been just resurrected which is not possible      
4

2 に答える 2

1

これはドキュメントからの抜粋です:

Model.delete([using=DEFAULT_DB_ALIAS]) オブジェクトに対して SQL DELETE を発行します。これは、データベース内のオブジェクトを削除するだけです。Python インスタンスは引き続き存在し、そのフィールドにはまだデータがあります。

オブジェクトを一括で削除する方法などの詳細については、オブジェクトの削除を参照してください。

カスタマイズされた削除動作が必要な場合は、delete() メソッドをオーバーライドできます。詳細については、事前定義されたモデル メソッドのオーバーライドを参照してください。

オブジェクトごとに、すべてのオブジェクトを削除してからオブジェクトを保存しますか?

cust = Customer.objects.all():

#delete all
for c in Customer.objects.all():
   c.delete()

これはより明確です。何が起こるべきかを説明しようとします(100%確実ではありません。そのようなことを試したことはありません)。

  • cust は QueryDict オブジェクトであり、ドキュメントが言うように、まだ入力されています
  • DB から顧客モデルに関連するすべてのデータが空になりました

これで、cust を反復処理して、各オブジェクトを再度保存できるはずです。

すべきことを心に留めてください、それは非常に重要です

于 2013-03-14T18:14:08.827 に答える
0

このcust変数には、QuerySet(Customer.objects.all()によって取得)に格納されているn番目の要素に関する情報のPython表現が含まれています。

delete()メソッドを呼び出すと、DBにアクセスしますが、削除されたオブジェクトに関するすべての情報は引き続きcust変数に格納されます。したがって、これでsave()メソッドを削除した後に呼び出すと、変数に含まれていたすべての情報がDBに新たに格納されます。

于 2013-03-14T18:18:30.150 に答える