クライアントの電話番号のバッチを生成しています。一致するレコードを見つけるために検索している Subscriber オブジェクトの大きな (25m+) テーブルを持っています。次に、Django の ForeignKey リレーションシップ (Subscriber オブジェクトには Customer オブジェクトへの ForeignKey があり、次に数値を含む CharField があります)。大規模な QuerySet の場合、バッチで重複した数値を取得しています。約 11 万人の購読者のリストで、約 5,000 の重複があります。
簡単なフィルターを使用して、最初の QuerySet を生成しています。
subscribers = Subscribers.objects.filter(foo='bar')
これは、バッチを生成する方法です。
batches = [
[s.customer.number for s in subscribers[x:x + batch_size]]
for x in xrange(0, subscriber_count, batch_size)
]
このメソッドをシェルでテストすると、問題なく動作します。本番環境でのみ失敗します。また、本番環境の小さなクエリセットにも最適です。約 50k+ のクエリセットのみが問題を抱えているようです。また、QuerySet から Subscriber オブジェクトのリストを作成しようとすると、すべてうまくいきます。
print list(subscribers)
本番環境でも正しく動作します。だからそれは
s.customer.number
何らかの形でルックアップが間違っていることがありますが、それは大きなクエリセットの場合のみです。