Как перевести icontains в django в оператор SQL? - PullRequest
0 голосов
/ 02 мая 2009

Я хочу получить топ-5 продажной цены каждый месяц в каждый год .

Итак, я вставил код, подобный этому

def query(request):
    from django.db import connection
    cursor = connection.cursor()
    cursor.execute("SELECT product_style_id ,sum(price) As total_p ,sum(cast( amount as int )) AS total_a FROM jewelry_productorder  group by product_style_id ORDER BY total_p DESC LIMIT 5 " )
    output = cursor.fetchall()
    variables = RequestContext (request, {'output':output,})
    return render_to_response('top5.html', variables)

Получился результат, показывающий топ-5 всей таблицы вместо топ-5 каждого месяца каждого года.

Итак, я вставил такой код (добавив предложение WHERE)

def query(request):
    m = request.GET['month']
    y = request.GET['year']
    d = str(y+'-'+m)
    from django.db import connection
    cursor = connection.cursor()
    cursor.execute("SELECT product_style_id ,sum(price) As total_p ,sum(cast( amount as int )) AS total_a FROM jewelry_productorder WHERE due_date LIKE %s group by product_style_id ORDER BY total_p DESC LIMIT 5 " ,[d])
    output = cursor.fetchall()
    variables = RequestContext (request, {'output':output,})
    return render_to_response('top5.html', variables)

результат получился вот так

ProgrammingError at / query

оператор не существует: дата ~~ неизвестна ЛИНИЯ 1: ... total_a ИЗ ювелирных изделий_производитель WHERE due_date LIKE E'200 ... ^ СОВЕТ: ни один оператор не соответствует заданному имени и типу (аргументам) аргумента. Возможно, вам придется добавить явные приведения типов.

Помогите мне пожалуйста, что мне делать ??

1 Ответ

2 голосов
/ 02 мая 2009

__ icontains в Django могут быть написаны на SQL с использованием ILIKE.

Пример:

SELECT ... WHERE some_column ILIKE '%some_string%'

Таким образом, вы можете переписать ваш запрос как:

cursor.execute("SELECT product_style_id ,sum(price) As total_p ,sum(cast( amount as int )) AS total_a FROM jewelry_productorder WHERE due_date ILIKE %s group by product_style_id ORDER BY total_p DESC LIMIT 5", ["%%%s%%" % d])

Если ваша БД не поддерживает ILIKE (как указано в комментарии к моему ответу), сделайте что-то вроде этого:

SELECT ... WHERE LOWER(some_column) LIKE LOWER('%some_string%')

Обратите внимание, что использование LOWER может помешать вашей БД использовать индекс (если у вас есть индекс для этого столбца).

Также обратите внимание, что в Django 1.1 добавлена ​​поддержка агрегирования, поэтому вы должны иметь возможность выполнять запросы GROUP BY, не прибегая к необработанному SQL. Проверьте это: http://docs.djangoproject.com/en/dev/topics/db/aggregation/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...