gpt4 book ai didi

django - 在 Django 模型查询中按顺序排列的原始 SQL

转载 作者:行者123 更新时间:2023-12-04 07:20:40 24 4
gpt4 key购买 nike

我有一个像这样的简单查询(我希望先是 1 BHK,然后是 2BHK,然后是其他任何东西)

select *
from service_options
order by case space when '1BHK' then 0 when '2BHK' then 1 else 2 end,
space
在Django中,怎么做?我有一个名为 ServiceOption 的模型
我试过这个,但没有运气。
ServiceOption.objects.order_by(RawSQL("case space when '1BHK' then 0 when '2BHK' then 1 else 2 end,space"), ()).all()
我不想用类似的东西执行原始查询
ServiceOption.objects.raw("raw query here")
Laravel ,像这样的东西很容易像这样被拉下来
Model::query()->orderByRaw('raw order by query here')->get();
任何输入将不胜感激。先感谢您。

最佳答案

您可以使用 .annotate(…) [Django-doc]然后 .order_by(…) [Django-doc] :

from django.db.models import Case, IntegerField, Value, When

ServiceOption.objects.annotate(
sp=Case(
When(space='1BHK', then=Value(0)),
When(space='2BHK', then=Value(1)),
default=Value(2),
output_field=IntegerField()
)
).order_by('sp', 'space')
原始查询会出现在这个
SELECT *, CASE WHEN "service_options"."space" = 1BHK THEN 0 WHEN "service_options"."space" = 2BHK THEN 1 ELSE 2 END AS "sp" FROM "service_options" ORDER BY "sp" ASC, "service_options"."space" ASC
您可以与 .alias(…) [Django-doc] 合作防止将其计算为列和 ORDER BY条款:
from django.db.models import Case, IntegerField, Value, When

ServiceOption.objects.alias(
sp=Case(
When(space='1BHK', then=Value(0)),
When(space='2BHK', then=Value(1)),
default=Value(2),
output_field=IntegerField()
)
).order_by('sp', 'space')
原始查询会出现在这个
SELECT * FROM "service_options" ORDER BY CASE WHEN ("service_options"."space" = 1BHK) THEN 0 WHEN ("service_options"."space" = 2BHK) THEN 1 ELSE 2 END ASC, "service_options"."space" ASC

关于django - 在 Django 模型查询中按顺序排列的原始 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68520660/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com