如何批量评估查询集?
How to evaluate a queryset in batches?
我有一个包含 100,000 多行的模型。我想对其进行一些操作,但由于尺寸原因无法一次完成。所以,我想到了这样使用分页器:
def fun():
paginator = Paginator(Model.objects.filter(**some_filter), 10000)
for page_no in paginator.page_range:
page = paginator.get_page(page_no)
queryset = page.object_list
# Do some operation on queryset
# Check if new records are added in the Model, (if yes, then do the operation on new records
only)
代码中的最后注释说,在 运行 上面的代码中,如果添加了新记录(因为这是一个实时应用程序),那么我们必须对这些记录执行相同的操作也是。
所以我的问题是如何将剩余的(新的)记录仅发送到 运行 相同的代码?
很简单。如果你的模型中有一个日期时间字段,在 'for' 的最后一项上,你可以将日期时间字段保存在一个变量中,并在 'for' 之后检查是否有任何对象的日期时间字段大于最后一项日期时间字段只对它们执行操作。这样可以防止对一个对象执行两次操作。
注意: 如果您的对象没有添加日期时间字段。
您始终可以按照其他答案的建议使用 created_at
字段来获取最新记录,如下所示:
queryset = Model.objects.filter(**some_filter)
while queryset.exists():
timestamp = datetime.datetime.now()
# Do your batching and other operations
queryset = queryset.filter('created_at__gt'=timestamp)
我有一个包含 100,000 多行的模型。我想对其进行一些操作,但由于尺寸原因无法一次完成。所以,我想到了这样使用分页器:
def fun():
paginator = Paginator(Model.objects.filter(**some_filter), 10000)
for page_no in paginator.page_range:
page = paginator.get_page(page_no)
queryset = page.object_list
# Do some operation on queryset
# Check if new records are added in the Model, (if yes, then do the operation on new records
only)
代码中的最后注释说,在 运行 上面的代码中,如果添加了新记录(因为这是一个实时应用程序),那么我们必须对这些记录执行相同的操作也是。
所以我的问题是如何将剩余的(新的)记录仅发送到 运行 相同的代码?
很简单。如果你的模型中有一个日期时间字段,在 'for' 的最后一项上,你可以将日期时间字段保存在一个变量中,并在 'for' 之后检查是否有任何对象的日期时间字段大于最后一项日期时间字段只对它们执行操作。这样可以防止对一个对象执行两次操作。
注意: 如果您的对象没有添加日期时间字段。
您始终可以按照其他答案的建议使用 created_at
字段来获取最新记录,如下所示:
queryset = Model.objects.filter(**some_filter)
while queryset.exists():
timestamp = datetime.datetime.now()
# Do your batching and other operations
queryset = queryset.filter('created_at__gt'=timestamp)