首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在执行之前将Django Queryset序列化为JSON用于芹菜

在执行之前将Django Queryset序列化为JSON用于芹菜
EN

Stack Overflow用户
提问于 2017-06-01 03:19:04
回答 4查看 1.8K关注 0票数 2

我从外部库获得了一个Queryset,由于Queryset很懒,所以我希望在访问它之前将它序列化为JSON,然后在DB中执行它,因此可以在异步芹菜任务中执行它。

我的问题是,是否有一种方法将Queryset的基本元素表示为JSON,这样我就不必使用Pickle了?

我知道我可以使用queryset.query获得原始查询,但是由于我必须在另一端执行一个原始查询,所以我不太喜欢这个想法。

详细信息

这里的具体用例是评估任务中的Queryset,这样就可以将结果导出到文件中,并转储到服务器上供以后访问。

结果集可能相当大,因此将导出作为标准请求/响应周期的一部分经常会超时。

请求是从Django Admin变更视图列表筛选器生成的。我已经尝试过查看列表筛选代码,但是它似乎只生成过滤器对象--不适合于JSON序列化。

我可以查看list filter查询字符串并重新计算Queryset过滤器中的所有键,但是许多过滤器都是SimpleListFilter类,它们也只是返回filter对象,并且不会在URL中显示真正的Queryset过滤器。我需要为这些过滤器重新创建逻辑,以获得一个可以被JSON序列化的kwarg风格的过滤器。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-07-10 06:03:21

Django 1.11和芹菜3.0更新

可悲的是,这已经行不通了。如果任何人在执行前都有关于如何正确序列化查询集或其各种筛选器和属性的任何信息,请告诉我。

原始答案

事实证明,my_queryset.query是在执行之前序列化QuerySet的正确和安全的方法。

如果以后只想对数据库中重新创建QuerySet所需的信息进行筛选,则将对QuerySet的查询属性进行筛选。然后,您可以使用如下代码重新创建原始QuerySet (不加载任何结果):

代码语言:javascript
运行
复制
import pickle
query = pickle.loads(s)     # Assuming 's' is the pickled string.
qs = MyModel.objects.all()
qs.query = query            # Restore the original 'query'.

查询属性是一个不透明的对象。它表示查询构造的内部,而不是公共API的一部分。但是,--如这里所描述的那样--对属性的内容进行分类和解压缩是安全的(并得到完全支持)。

https://docs.djangoproject.com/en/1.11/ref/models/querysets/#pickling-querysets

这涉及到如何使用泡菜,但当然,它也与JSON序列化程序一起工作。

代码语言:javascript
运行
复制
# admin.py
...
    export_data.delay(queryset.query)
...

# tasks.py
@task(serializer='json')
def export_data(query):
    qs = MyModel.objects.all()
    qs.query = query
...
票数 2
EN

Stack Overflow用户

发布于 2021-02-24 11:09:31

在编写本报告时,使用Python和Django 2.2,pickle转储/加载似乎可以工作。它最终只缺少了一个queryset.update()

我试过这样的方法:

代码语言:javascript
运行
复制
# packing
queryset = MyModel.objects.filter(...)
serialized_queryset = pickle.dumps(queryset.query)

# unpacking
restored = MyModel.objects.all()
restored.query = pickle.loads(serialized_queryset)
restored.update()

而且效果很好。还没有在芹菜任务中进行测试,但我认为它应该能起作用。

票数 2
EN

Stack Overflow用户

发布于 2017-06-01 06:29:08

在芹菜任务中,您不必序列化QuerySet来访问它。您可以使用Django模型并在任务本身中创建QuerySet。如果有创建QuerySet的特定方式,您可以将QuerySet创建代码放在一个公共函数或类中,并将该共享代码导入web应用程序代码和芹菜任务中。

没有理由避免在芹菜任务中使用Django ORM。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44297928

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档