如何从Django中的数据库重新加载整个查询集?

时间:2019-02-13 09:21:28

标签: python django celery celerybeat

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

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

最初(在开始启动celery之前)在数据库中有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 个答案:

答案 0 :(得分:0)

使用all()方法。这样就可以生成没有缓存结果的queryset副本。选中this doc

所以您可以

@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()