1

我正在使用 django ORM 的 exact() 方法仅从一组模型中查询选定的字段以节省 RAM。由于对我正在使用的 ORM 管理器的一些限制(它不是默认的),我不能使用 defer() 或 only()。

以下代码可以正常工作,没有错误:

 q1 = Model.custom_manager.all().extra(select={'field1':'field1'})
 # I only want one field from this model

但是,当我对 q1 查询集进行 jsonify 时,我得到了模型的每个字段。所以 extra() 一定不起作用,还是我做错了什么?

print SafeString(serializers.serialize('json', q1))
>>> '{ everything!!!!!}'

更具体地说,我使用的自定义管理器是 django-sphinx。例如 Model.search.query(...)。

谢谢。

4

1 回答 1

2

所以,我不确定你是否可以做你想做的事。但是,如果您只想要特定字段或几个字段的值,则可以使用

它可能会执行完整查询,但结果只会包含您想要的值。使用您的示例:

q1 = Model.custom_manager.values('field1', 'field2').all()

这应该返回一个 ValuesQuerySet。您将无法使用它,serializers.serialize因此您必须执行以下操作:

from django.utils import simplejson
data = [value for value in q1]
json_dump = simplejson.dumps(data)

另一个可能更好的解决方案是按照最初的预期进行查询,忘记extra并在方法中values使用fieldskwarg,serialize如下所示:

print SafeString(serializers.serialize('json', q1, fields=('field1', 'field2')))

缺点是这些东西实际上都没有与 Defer 或 Only 做同样的事情(所有字段都从数据库返回),但你会得到你想要的输出。

于 2013-07-23T20:38:27.957 回答