Как оценить набор запросов партиями? - PullRequest
0 голосов
/ 10 июля 2020

У меня есть модель со 100 000+ строками. Я хочу проделать с ним какую-то операцию, но не могу сделать это за один go из-за размера. Итак, я подумал об использовании 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 ]

1 голос
/ 28 июля 2020

Вы всегда можете использовать поле 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)
0 голосов
/ 10 июля 2020

это просто. если у вас есть поле datetime в вашей модели, на последнем элементе в 'for' вы можете сохранить поле datetime в переменной и после 'for' проверить, есть ли какой-либо объект с полем datetime больше, чем поле datetime последнего элемента делать операцию только на них. это предотвращает выполнение операции дважды над одним объектом.

ПРИМЕЧАНИЕ: если ваш объект не имеет поля datetime, добавьте к нему.

...