首页 > 解决方案 > 如何从 django 中的 db 重新加载整个查询集?

问题描述

我正在用芹菜运行定期任务。一项这样的任务通过过滤器从 db 获取对象:

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

最初(在启动 celery 本身之前)在 db 中有 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()with @transaction.atomic。但这会停止任务的执行,因为事务不适用于多个工作人员和任务。

我在这里做错了什么?

标签: pythondjangocelerycelerybeat

解决方案


使用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()

推荐阅读