Запросы Python / Django - добавление необработанного SQL к объекту модели - PullRequest
1 голос
/ 10 февраля 2011

Я хочу добавить raw sql к объекту модели Django.Запрос в SQL я хотел бы выполнить без написания всей вещи.Необработанный SQL:

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

По сути, элементы заказа по полю заказа, но если их значение заказа '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 ]

1 голос
/ 10 февраля 2011

Не делайте этого.

Делайте это.

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 )
0 голосов
/ 29 сентября 2014

Поместите пользовательский SQL в select из extra, а затем используйте order_by для упорядочения по новому значению:

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

extra docs

...