Как перезагрузить весь набор запросов из БД в Django?

Я бегу периодические задачи с сельдереем. Одна такая задача получает объекты из БД с помощью фильтра:

pages = Page.objects.filter(active=True)

изначально (до запуска самого сельдерея) в БД 10 таких объектов с active=True, При запуске задача выполняется соответствующим образом на всех этих 10 объектах.

from django.db import transaction
from celery.task import task
from celery import group
from .models import Page

#@transaction.atomic
@task()
def check_pages():
    #@transaction.commit()
    pages = Page.objects.filter(active=True) #not updated later
    g = group(page_check.s(page.id) for page in pages)
    g()


#settings.py
app.conf.beat_schedule = {
    'run-every-1-second': {
        'task': 'tasks.check_pages',
        'schedule': 1.0,
    },
}

Теперь, если я добавлю еще Page объект с active=True, это не распознается или не фильтруется в задаче (которая уже выполняется периодически).

я знаю obj.reload_from_db(), Но это применимо только для перезагрузки объекта, а не <QuerySet>,

Я также пытался использовать transaction.commit() с @transaction.atomic, Но это останавливает выполнение задач, так как транзакция не работает над несколькими работниками и задачами.

Что я здесь не так делаю?

1 ответ

Использование all() метод. Это делает копию набора запросов без кэшированного результата. Проверьте этот документ

Так что вы можете

@task()
def check_pages():
    #@transaction.commit()
    pages = Page.objects.filter(active=True).all() # now it will update later
    g = group(page_check.s(page.id) for page in pages)
    g()
Другие вопросы по тегам