2017-12-26 23 views
0

私はDjangoクエリーセットをループさせようとしています。最後のレコードから始めて、一度に1,000レコードを戻しています。私は次のクエリで最後の1000レコードを取得することができます:Djangoクエリーセットの最後までループする

employees = Employee.objects.all().order_by('-id')[:1000] 

私のクエリセットは10,0000結果です。どうすれば8,000から9,000にすることができますか?総レコード数を取得するには、.count()を使用する必要がありますか?私の完全なクエリーセットは1,200万レコードなので、可能ならばそれを避けようとしています。

+0

問題のある場所を正確に指定してください。 count()を呼び出すことなく、最後から一度にすべてのレコード1000を取得できるようにしたいですか? – TGO

+1

https://docs.djangoproject.com/en/2.0/topics/pagination/をお探しですか? – allcaps

+0

@TGO私はelasticsearchインデックスを最新の状態に保とうとしています。私がElasticsearch-DSL-Djangoを使っているパッケージは、最初のレコードから始まり、最近のレコードを取り込むために最後まで行きます。だから、私は最後からやり直して新しいレコードが見つからなくなるまで元に戻そうとしています。 – Casey

答えて

0

ここに私が思いついた解決策があります。 count()を使わないとできませんでした。しかし、私はそれのための生のSQLに切り替わった、より速くなるはずです。

from django.db import connection 
from employee.models import Employee 

# count records using raw SQL (best for larger datasets) 
cursor = connection.cursor() 
cursor.execute('SELECT COUNT(*) FROM employee_employee;') 
(count,) = cursor.fetchone() 

records_to_index = 100000 
batch_size = 3000 

# loop through batch starting at end of queryset going backwards 
# continue until records_to_index is met 
for end in range(count, count - records_to_index, -batch_size): 
    # add 1 to ensure records do not overlap 
    start = end - batch_size + 1 

    employees = Employee.objects.all().order_by('id')[start:end] 

    for employee in employees: 
     # work with object 
関連する問題