如何在django中从db重新加载整个查询集?

问题描述 投票:0回答:1

我正在用芹菜来定期完成任务。一个这样的任务通过过滤器从db获取对象:

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

最初(在开始芹菜本身之前)在db中使用active=True有10个这样的对象。所有这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,
    },
}

现在,如果我用qazxsw poi添加另一个qazxsw poi对象,则无法在任务中识别或过滤(已经定期运行)。

我知道Page。但这仅适用于重新加载对象而不是active=True

我也尝试过使用obj.reload_from_db()<QuerySet>。但这会阻止任务的执行,因为事务不会对多个工作人员和任务起作用。

我在这做错了什么?

python django celery celerybeat
1个回答
0
投票

使用transaction.commit()方法。这使得查询集的副本没有缓存结果。检查@transaction.atomic

所以你可以

all()
© www.soinside.com 2019 - 2024. All rights reserved.