Django只使用.extra()查询模型的一个字段,而不使用.defer()或.only()

时间:2013-07-23 18:38:39

标签: python django orm django-models django-sphinx

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

以下代码可以正常运行:

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

然而,当我jsonify q1查询集时,我得到了模型的每一个字段..所以extra()一定不行,或者我做错了什么?

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

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

感谢。

1 个答案:

答案 0 :(得分:2)

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

进行操作

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

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)

另一种可能更好的解决方案就是按照原定的意图执行查询,忘记extravalues,并在fields方法中使用serialize kwarg,如下所示:

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

缺点是这些东西实际上都与Defer或Only(从数据库中返回所有字段)完全相同,但是你得到了你想要的输出。