我有一个100,000行以上的模型。我想对其进行一些操作,但由于尺寸原因,无法一次完成。所以,我想到了像这样使用Paginator:
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)
代码中的最后一条注释说,在运行上述代码时,如果添加了新记录(因为这是一个实时应用程序),那么我们也必须对这些记录执行相同的操作。
所以我的问题是如何只剩下的(新)记录来运行相同的代码?
答案 0 :(得分:1)
您总是可以根据其他答案的建议使用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)
答案 1 :(得分:0)
很简单。如果模型中有datetime字段,则可以在'for'的最后一项上保留datetime字段为变量,并在'for'之后检查是否有datetime字段大于最后一项datetime字段的对象对他们进行操作。这样可以防止对一个对象执行两次操作。
注意::如果您的对象没有datetime字段,请添加到其中。