11

django モデルでテーブルをクリアしてリロードしようとしていますが、

>>> models.PuzzleSum.objects.all().count()
2644
>>> models.PuzzleSum.objects.all().delete()
>>> models.PuzzleSum.objects.all().count()
2535

…えっ?常にマジック ナンバー 109 です。データベースにアクセスして手動で削除できることはわかっていますが (または、すべてなくなるまでループします)、興味があります。

(Mac OS X Lion の Django 1.3.1)

4

2 に答える 2

6

はい、Djangoはすべてのオブジェクトをdictに保存してから、それらを1つずつ削除します。これが、一意のアイテムのみが繰り返されるために削除される理由です。これは、削除するモデルを収集するDjangoCollectorクラスからのものです。

self.data = SortedDict([(model, self.data[model])
                        for model in sorted_models])

その後:

# delete instances
for model, instances in self.data.iteritems():
    query = sql.DeleteQuery(model)
    pk_list = [obj.pk for obj in instances]
    query.delete_batch(pk_list, self.using)

モデルをオーバーライドしている限り__hash__、モデルがself.data dictに保存されると、一意のモデルのみが保存されてから削除されます。

于 2012-07-31T07:23:41.497 に答える
2

上記のコメントを質問への回答に変換します。

使用したい「重複」の特定の定義のために、PuzzleSum でhasheqをオーバーライドしました。そして、何を推測しますか: 109 個の異なるハッシュ値があります。Django は、削除ロジックの内部のどこかで一連のオブジェクトを使用している必要があります。

于 2012-07-31T05:48:08.030 に答える