1

私はDjangoプロジェクトを持っています。ありMyModelますmodels.py。このモデルには 4 000 000 のインスタンスがあります。

私はこのスクリプトを実行します:

for m in MyModel.objects.all():
    if len(m.phone) < 10 or len(set(m.phone)) <= 2:
        m.delete()

しかし、それはpythonを殺します(単に「殺されました」と出力します)。

私は知っています、問題はインスタンスの数にあります。しかし、どうすればそれらすべてを反復できますか?

4

3 に答える 3

6

最初にオブジェクトをカウントしてみると、それらはスライスされたバージョンで繰り返されます。何かのようなもの:

step = 10
count = MyModel.objects.count()/step
for i in xrange(count):
    for m in MyModel.objects.all()[i*step:(i+1)*step]:
        # doing something with m
于 2012-09-03T20:09:47.980 に答える
4

iterator()の代わりにを使用するとall()、Django はクエリセットをキャッシュしません。これにより、メモリ使用量が削減され、パフォーマンスが向上します。

for m in MyModel.objects.iterator():
    # doing something with m
于 2012-09-03T20:39:59.730 に答える