【问题标题】:Loop through the end of a Django queryset循环遍历 Django 查询集的末尾
【发布时间】:2017-12-26 00:28:02
【问题描述】:

我正在尝试遍历 Django 查询集,从最后一条记录开始,一次返回 1,000 条记录。我可以通过以下查询获得最后 1,000 条记录:

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

假设我的查询集是 10,0000 个结果。我怎样才能从 8,000 到 9,000?我必须使用 .count() 来获取总记录数吗?我的完整查询集是 1200 万条记录,所以我尽量避免这种情况。

【问题讨论】:

  • 您能否具体说明您的问题出在哪里?您是否希望能够从最后一条开始一次检索 1000 条记录,而无需调用 count()?
  • @TGO 我正在尝试使弹性搜索索引保持最新。我使用 Elasticsearch-DSL-Django 的包从第一条记录开始,一直到最后,以填充最近的记录。所以我试图简单地从头开始,直到找不到新记录。
  • 你可以使用reverse()获取最新记录,count()方法知道记录数,count可能是了解记录数的最佳方法。

标签: django django-queryset


【解决方案1】:

这是我想出的解决方案。如果不使用 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-22
    • 2023-03-22
    相关资源
    最近更新 更多