【问题标题】:How to limit columns returned by Django query?如何限制 Django 查询返回的列?
【发布时间】:2011-01-27 18:49:56
【问题描述】:

这看起来很简单,但所有 Django 查询似乎都是 'SELECT *'

如何构建只返回字段子集的查询?

【问题讨论】:

    标签: django orm


    【解决方案1】:

    .values("column1", "column2", ...) 附加到您的查询中

    【讨论】:

    • A 注意:如果您使用.get() 而不是.filter() 来获取特定对象,并且想要检索特定列,则需要确保在.get() 之前指定.values('field1',...)方法。如果是之后,它会生成错误,因为它获取对象,然后尝试在 model instance 而不是 objects 属性上运行 .values() 方法。
    • 这个答案比公认的答案要好得多(因为它实际上回答了这个问题。在没有代码示例的情况下说“查看文档”或“使用这个或那个”不是真正的答案)。我也已经在使用 QuerySet.values(),这样就更容易了。谢谢!
    【解决方案2】:

    从 Django 1.1 开始,您可以使用 defer('col1', 'col2') 从查询中排除列,或使用 only('col1', 'col2') 仅获取特定的一组列。见the documentation

    values 稍有不同 - 它只获取您指定的列,但它返回一个字典列表而不是一组模型实例。

    【讨论】:

    • @Daniel,你知道为什么文档说明要避免这些方法吗?它说他们应该是最后的手段,应该先用尽其他方法。
    • 它给了我不可预知的结果....说我有模型员工,我做qs=Employee.objects.all()qs[0].pk 结果是实例但是我做qs2 = Employee.objects.all().filter(pk=1).only(id) 然后qs2[0].id 它花了很长时间。 ..
    • 还有 values_list() 返回元组而不是字典(如 values() )。 Only() 和 Defer() 返回实际的模型对象,但缺少将按需加载的数据(这非常昂贵,因此请确保您知道自己在做什么)。所以每个都有不同的用例。
    • 关于 defer() 和 ony() 方法的答案可能会产生误导。正如 Apollo Data 指出的那样,这将排除这些字段中的数据,而不是字段本身。
    • 如果它实际上包含一个代码示例,甚至是关于如何使用 deferonly 的描述,这将是一个很好的答案。从单个堆栈溢出页面获得答案优于访问额外的文档页面。伊恩在下面的答案中做得很好。
    猜你喜欢
    • 2011-01-29
    • 2011-05-28
    • 1970-01-01
    • 2012-03-31
    • 1970-01-01
    • 2015-11-18
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    相关资源
    最近更新 更多