如何分批评估查询集?

时间:2020-07-10 13:24:48

标签: mysql django django-models django-queryset

我有一个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)

代码中的最后一条注释说,在运行上述代码时,如果添加了新记录(因为这是一个实时应用程序),那么我们也必须对这些记录执行相同的操作。

所以我的问题是如何只剩下的(新)记录来运行相同的代码?

2 个答案:

答案 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字段,请添加到其中。