2017-03-02 7 views
0

djago-viewでデコレーターを使用して、または使用せずに、すなわちdb-writesまたはdb-writeのループを使用して、データベースとtxtの項目を追加しました。パフォーマンスの差は無限に近いです^^django組み込み管理アクションdelete - パフォーマンスが悪い理由?

私の所見:管理パネルのデフォルトの削除アクションは、明らかに(下位の)ループをdb-wirtesにします。これは、が実際にはで1000エントリを削除するのにかかる時間です。

なぜこれは、理由がある、私は何かを欠いているのですか? またはこれを修正してプルリクエストをオープンする必要がありますか?)(最初のoss-contributionです:))

最初の回答に記載されているように、アクションと実際の削除の間に確認のステップがあります。しかし、確認の後でさえ、データベースがロックされている間にアイテムを削除するには数分(数千のエントリのために)かかるので、その時点で戻る方法はありません...

答えて

1

一括削除を行う場合、あなたのコードは、あなたが困っているそれらのいずれかに依存しているので、もし、モデルdelete()方法でも、最終的pre_deletepost_delete信号でもないが、呼び出されます。インスタンスをループして、delete()メソッドを個別に呼び出すことは非常に賢明な選択です。バグとして報告する必要はありません(パッチを提出する必要はありません)。

+0

は感覚的です:) – Ilja

1

いつでもあなた自身を追加することができますdelete関数は、djangoのqueryset.delete()関数を使用して、大量削除クエリを実行します。

https://docs.djangoproject.com/en/1.10/ref/models/querysets/#delete

私は理由は管理者は、削除のためにループを使用して、それは確認を求めることで、削除されますすべての関連するオブジェクトを示していますだと思います。多数のエントリがある場合は、時間がかかります。 (一括削除よりもはるかに安全ですが)。

アクションをどこかに作成します(私はactions.pyファイルを使用します)。

def fast_delete(modeladmin, request, queryset): 
    queryset.delete() 

あなたのadmin.pyファイルにインポートし、それをModelAdminクラスのアクションに追加します。

from myapp.actions import fast_delete 

MyModelAdmin(admin.ModelAmdin): 
    model = MyModel 
    action = [fast_delete,] 
+0

独自の管理アクションを定義していただきありがとうございます。組み込みのものについては、私は確認についてあなたのポイントを参照してください、しかし、これは主要な遅延ではありません。最後の確認(クエリーセットはそれからまだアクセス可能なはずです)の後でも、それはループを行います。 – Ilja

+0

確認だけを求めるのではなく、私の答えです。 –

関連する問題