【问题标题】:Pickle a django query?腌制一个 django 查询?
【发布时间】:2011-04-19 11:14:45
【问题描述】:

是否可以腌制或以某种方式将 django 查询存储在数据库中?这行不通:

u = User.objects.all 
import cPickle
pickled_query = cPickle.dumps(u) # and store the pickled_query in a db-field.

有什么想法吗?

更新:

import cPickle

class CustomData(models.Model):
    name = models.CharField(max_length = 30)
    pickled_query = models.CharField(max_length = 300)

def get_custom_result(self):
    q = cPickle.loads(self.pickled_query)
    return q()

>>> cd = CustomData(name="My data", pickled_query=cPickle.dumps(User.objects.all))
>>> cd.save()
>>> for item in cd.get_custom_result(): print item
# prints all the users in the database, not printing the query result 
# when pickled, but when called like cd.get_custom_result(), that is when 
# the query is actually executed.

现在这就是我想做的。我知道这段实际的代码不会运行,但它表明了我的意图;存储查询,而不是结果,并在将来的某个时间执行该查询。

更新 #2:

>>> from django.contrib.auth.models import User
# adds two users; super and test
>>> u = User.objects.filter(username = 'test')
>>> import cPickle
>>> s = cPickle.dumps(u.query)
>>> s2 = cPickle.loads(s)
>>> o = s2.model.objects.all()
>>> o.query = s2
>>> for i in o: print i
...
super

仍然不完全满意。我知道 QuerySets 是懒惰的,所以 s2.model.objects.all() 不会执行获取所有用户的查询?

【问题讨论】:

  • Django 已经可以序列化对象了。它有一个序列化模块就是为了这个。你读过这个吗? docs.djangoproject.com/en/1.3/topics/serialization
  • 您是要腌制查询还是查询结果?
  • 我不是腌制查询结果,只是方法,所以我可以稍后对其进行脱盐处理:query_method = cpickle.loads(pickled_query);对于 query_method() 中的 orm_instance:打印 orm_instance。是不是更清楚了?
  • 没有。再清楚不过了。请更新您的问题,并提供一些示例或一些用例或您正在尝试做的一些详细描述。

标签: python django pickle


【解决方案1】:

documentation 。基本上,如果您想重新创建 SQL 查询,请腌制 query 属性,如果您想腌制当前结果的快照,请腌制整个查询集。

如果您腌制all() 的结果而不是绑定方法,您的示例将执行后者。

【讨论】:

  • 啊!我明白了,但 all() 不会执行查询吗?我需要知道查询与什么模型相关?
  • 查询有一个model 属性。如果您腌制 QuerySet(而不是 Query),则当前结果集将被序列化——这需要执行它。顺便说一句:all() 不执行查询。
  • @Weholt:不,all() 不执行查询。只有当你真正尝试迭代结果时,它才会被执行。
  • 这似乎不起作用。在我使用自定义查询设置查询属性之前和之后调用 qs.count() 会返回相同的数字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-04
  • 1970-01-01
  • 2016-02-21
  • 1970-01-01
  • 2011-05-08
  • 1970-01-01
相关资源
最近更新 更多