2009-05-02 2 views
0

Я хочу приобрести 5 самых продаваемых цен каждый месяц в каждый год.Как перевести значки в django в SQL-инструкцию?

Так что я положил в коде, как этот

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 в/запросе

оператор не существует: дата ~~ unknown LINE 1: ... total_a FROM jewelry_productorder WHERE due_date LIKE E'200 ... ^ СОВЕТ: Оператор не соответствует указанному имени и типу аргументов. Возможно, вам придется добавлять явные типы.

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

+0

Какую базу вы используете? – ibz

ответ

2

__Информации в 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]) 

Если DB не поддерживает 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/

+1

ILIKE недоступен во всех базах данных. –

Смежные вопросы