Python / Django 查询 - 将原始 SQL 附加到模型对象

1 投票
2 回答
1731 浏览
提问于 2025-04-16 11:32

我想在Django的模型对象中添加原始SQL查询。我想执行的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)")

有没有什么线索???

2 个回答

0

把你自定义的SQL语句放在extra里的select部分,然后用order_by来根据这个新值进行排序:

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

extra 文档

0

别那样做。

这样做。

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 )

撰写回答