gpt4 book ai didi

python - 在 Django 1.11 中将 QuerySet 传递给 Celery 任务

转载 作者:行者123 更新时间:2023-12-01 09:31:24 25 4
gpt4 key购买 nike

我想将一些长查询移至 Celery 中的异步任务,然后使用 AJAX 检索该额外信息。现在我得到这样的 QuerySet:

brands = Brand.objects.filter(shops__shop_name__in=[shop])

任务:

@task()
def brand_count(querystr):
querystr.annotate(amount_of_products=Count('products'))

我想做 here :

task_run = brand_count.delay(brands)

问题是:如何将 QuerySet 传递给 Celery 任务? 现在它会抛出一个错误,表明无法完成此操作。

我有found此处可能会使用pickle,但我无法找到正确的使用方法。特别是 - query = pickle.loads(s) 中的 # Assuming 's' is the pickled string. 是什么意思。

最佳答案

正如您发现的,您无法直接将查询集传递给任务,因为任务参数必须是可序列化的。 Pickling 也不是一个理想的选择,因为您实际上不需要序列化整个查询集。

相反,您应该将对象 ID 列表传递给任务,然后从任务本身获取查询集。

brand_ids = Brand.objects.filter(shops__shop_name__in=[shop]).values_list('id', flat=True)
task_run = brand_count.delay(list(brand_ids))

values_list将为您提供品牌 ID 列表。

然后,在您的任务中,您重新创建查询集并用它执行您需要的操作:

@task()
def brand_count(brand_ids):
queryset = Brand.objects.filter(id__in=brand_ids)
queryset.annotate(amount_of_products=Count('products'))

关于python - 在 Django 1.11 中将 QuerySet 传递给 Celery 任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49947767/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com