【问题标题】:Python / Django Queries - Append Raw SQL To Model ObjectPython / Django 查询 - 将原始 SQL 附加到模型对象
【发布时间】:2011-06-24 10:57:50
【问题描述】:

我想将原始 sql 添加到 Django 模型对象。我想在不编写整个内容的情况下执行 SQL 中的查询。原始 SQL 是:

SELECT * FROM elements ORDER BY IF(elements.order=0, 99999, elements.order) ASC

基本上,按 order 字段对元素进行排序,但如果它们的 order 值为 '0',则它们排在最后。

我尝试过使用 extra() 或附加 raw() 没有任何巨大的成功......我希望能够做这样的事情:

Elements.objects.all().extra("ORDER BY IF(order=0, 99999, order)")  ## or
Elements.objects.all().raw("ORDER BY IF(order=0, 99999, order)")

有什么线索???

【问题讨论】:

    标签: python django django-models


    【解决方案1】:

    将自定义SQL放到extraselect中,然后使用order_by按新值排序:

    Elements.objects.all().extra(
        select={
            'my_order_no': 'IF(elements.order=0, 99999, elements.order)'
        },
        order_by='my_order_no'
    );
    

    extra docs

    【讨论】:

      【解决方案2】:

      不要那样做。

      这样做。

      results = list( Element.objects.filter(whatever).exclude( order__isnull=True ).order_by( order ) )
      results.extend( Element.objects.filter(whatever).filter( order__isnull=False ) )
      

      这将避免过于复杂的 SQL。

      试试这个。它真的很快。它可能比 SQL 更快。

      def by_order( item ):
          return item.order if item.order is not None else 2**32
      results = list( Element.objects.filter(whatever).all() )
      results.sort( key=by_order )
      

      【讨论】:

      • 谢谢。我喜欢答案和建议!虽然,要回答最初的问题,是否可以按照我的要求做?
      猜你喜欢
      • 2017-05-04
      • 2015-03-22
      • 2020-06-11
      • 2016-08-31
      • 2019-07-02
      • 2015-11-21
      • 2012-03-16
      • 1970-01-01
      • 2017-10-09
      相关资源
      最近更新 更多