Как перезагрузить весь набор запросов из БД в 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()