Запрос Django raw (), вычисляемое поле в предложении WHERE - PullRequest
1 голос
/ 17 марта 2011

Мне интересно, есть ли какие-либо ограничения на синтаксис метода raw () при использовании вычисляемых полей.Вот краткий пример:

Company.objects.raw('''SELECT *,core_location.a + core_location.b as dist
FROM core_location,core_company  
ORDER BY dist''')

Приведенный выше код работает должным образом (результаты сортируются по вычисляемому полю 'dist'), но когда я добавляю предложение WHERE, например:

Company.objects.raw('''SELECT *,core_location.a + core_location.b as dist
FROM core_location,core_company
WHERE dist<10  
ORDER BY dist''')

я получаю (1054, "Неизвестный столбец dist в 'предложении where")

Пока что похоже, что я не могу использовать вычисляемое поле в предложении WHERE, но могу использовать его в ORDERЗаявление BYПожалуйста, поделитесь своим опытом.Спасибо.

Ответы [ 2 ]

7 голосов
/ 17 марта 2011

Это на самом деле не имеет ничего общего с Django, но с тем, как работает MySQL.

Вы не можете использовать псевдонимы в условиях WHERE, потому что оценка предложения WHERE предшествует оценке псевдонимов.

Вы можете либо:

  • Повторить предложение:

    Company.objects.raw('''SELECT *,core_location.a + core_location.b as dist
    FROM core_location,core_company
    WHERE (core_location.a + core_location.b)<10    
    ORDER BY dist''')
    
  • Сделать выбор:

    Company.objects.raw('''SELECT * FROM (
        SELECT *,core_location.a + core_location.b as dist
        FROM core_location,core_company            
    ) as subselect
    WHERE dist<10  
    ORDER BY dist''')
    
3 голосов
/ 02 февраля 2012

Вы можете использовать предложение HAVING для производных столбцов.КСТАТИ - это включает в себя столбцы, которые являются агрегации, например, результат SUM, COUNT и т. Д.

Итак, должно работать следующее:

Company.objects.raw('''SELECT *,core_location.a + core_location.b as dist
FROM core_location,core_company
HAVING dist<10  
ORDER BY dist''')
...