python - 如何从 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
。但这会停止任务的执行,因为事务不适用于多个工作人员和任务。
我在这里做错了什么?
解决方案
使用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()
推荐阅读
- gtk3 - C 程序不在 buildroot 上运行
- linux - 为什么在启用大小优化配置的情况下编译内核时会抑制变量未初始化的警告?
- java - 如何使用 LocalBroadcastManager 调用不同的方法
- excel - Angular 6 使用 sheetJs 生成 excel 文件但删除了一些键?
- web-scraping - 使用 BeautifulSoup 找不到深层嵌套标签 ID
- c++ - CWPack - cw_pack_context_init 中的“数据”是什么?
- excel - 如何将 Excel 与 IBM Watson 连接起来
- java - 无需手动编辑构建路径的 JavaFX 11 设置
- symfony - 如何在 FOR 循环中更改元素的值
- javascript - 过滤器值的增加和减少在 Camanjs 中无法正常工作