2009-05-02 5 views
0

Ich möchte die Top 5 des Verkaufspreises von jeden Monat in jedes Jahr bekommen. statt Top 5 eines jeden Monats in jedem JahrWie übersetze ich icontains in Django zu SQL-Anweisung?

Also habe ich in den Code wie dieser

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) 

das Ergebnis kamen die Top 5 der gesamten Tabelle zeigt.

Also habe ich in dem Code wie folgt (durch die WHERE-Klausel hinzugefügt)

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) 

kam das Ergebnis wie dieses bei

ProgrammingError out/query

Operator existiert nicht: Datum ~~ unbekannt LINE 1: ... total_a FROM jewelry_productorder WHERE Fälligkeitsdatum LIKE E'200 ... ^ HINWEIS: Kein Operator entspricht dem angegebenen Namen und Argumenttyp (en). Möglicherweise müssen Sie explizite Typumwandlungen hinzufügen.

Hilf mir bitte, was soll ich tun ??

+0

Welche Datenbank verwenden Sie? – ibz

Antwort

2

__icontains in Django kann mit ILIKE in SQL geschrieben werden.

Beispiel:

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

So können Sie Ihre Abfrage neu zu schreiben wie:

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]) 

Wenn Ihre DB nicht ILIKE unterstützt (wie in einem Kommentar auf meine Antwort darauf hingewiesen), etwas zu tun wie folgt:

Beachten Sie, dass die Verwendung von LOWER Ihre Datenbank daran hindert, den Index zu verwenden (wenn Sie einen Index haben auf dieser Spalte).

Beachten Sie außerdem, dass Django 1.1 Aggregationsunterstützung hinzugefügt hat. Daher sollten Sie in der Lage sein, GROUP BY-Abfragen durchzuführen, ohne auf Raw SQL zurückgreifen zu müssen. Überprüfen Sie diese: http://docs.djangoproject.com/en/dev/topics/db/aggregation/

+1

ILIKE ist nicht in allen Datenbanken verfügbar. –

Verwandte Themen