我正在使用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(...)。
感谢。
答案 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)
另一种可能更好的解决方案就是按照原定的意图执行查询,忘记extra
和values
,并在fields
方法中使用serialize
kwarg,如下所示:
print SafeString(serializers.serialize('json', q1, fields=('field1', 'field2')))
缺点是这些东西实际上都与Defer或Only(从数据库中返回所有字段)完全相同,但是你得到了你想要的输出。