【问题标题】:Django Query only one field of a model using .extra() and without using .defer() or .only()Django 仅使用 .extra() 查询模型的一个字段,而不使用 .defer() 或 .only()
【发布时间】:2013-07-23 00:08:45
【问题描述】:

我正在使用 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(...)。

谢谢。

【问题讨论】:

  • 这里的.select({'field1':'field1'}) 是什么?
  • 哦抱歉,我打错了,应该是 .extra(select={'field1':'field1'})

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


【解决方案1】:

所以,我不确定你是否可以做你想做的事。但是,如果您只需要特定字段或几个字段的值,则可以使用 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 并在 serialize 方法中使用 fields kwarg,如下所示:

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

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

【讨论】:

    猜你喜欢
    • 2021-05-29
    • 2011-01-06
    • 2021-11-14
    • 2013-02-23
    • 2011-12-02
    • 2015-10-06
    • 2014-03-09
    • 2021-10-18
    • 2020-07-31
    相关资源
    最近更新 更多