Django order_by特定订单

时间:2012-04-26 08:35:32

标签: django django-orm

是否可以在django ORM中复制这种特定的sql顺序:

order by

(case

    when id = 5 then 1

    when id = 2 then 2

    when id = 3 then 3

    when id = 1 then 4

    when id = 4 then 5

end) asc

3 个答案:

答案 0 :(得分:31)

自Django 1.8 以来,您有Conditional Expressions,因此不再需要使用extra了。

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

SomeModel.objects.annotate(
    custom_order=Case(
        When(id=5, then=Value(1)),
        When(id=2, then=Value(2)),
        When(id=3, then=Value(3)),
        When(id=1, then=Value(4)),
        When(id=4, then=Value(5)),
        output_field=IntegerField(),
    )
).order_by('custom_order')

答案 1 :(得分:4)

您可以使用extra()或更简单的raw()执行此操作,但在更复杂的情况下它们无法正常工作。

qs.extra(select={'o':'(case when id=5 then 1 when id=2 then 2 when id=3 then 3 when id=1 then 4 when id=4 then 5 end)', order_by='o'}

YourModel.raw('select ... order by (case ...)')

对于您的代码,条件集非常有限,您可以轻松地在Python中进行排序。

答案 2 :(得分:4)

有可能。从Djnago 1.8开始,你可以这样做     来自django.db.models导入案例,何时

import React, { Component } from "react";
import Tournaments from "./Tournaments";

const tournyAPI = 'http://localhost:8080/api/tournaments';

class template extends Component {

  constructor() {
    super();
    this.state = {
      data: [],
    }
  }

  componentDidMount() {
    fetch(tournyAPI)
    .then((Response) => Response.json())
    .then((findresponse) => {
      console.log(findresponse)
      this.setState({
        data:findresponse,
      })
    })
  }

  render() {
    return (
      <div class="container">
        <div class="row">
          <div class="col-md-6 col-md-offset-3">
            <div class="jumbotron text-center">
            {
              this.state.data.map((dynamicData, key) =>
              <div>
                <h1>{dynamicData.name}</h1>
              </div>
              )
            }
          </div>
        </div>
      </div>
    </div>
    );
  }
}


export default template;