2016-04-20 6 views
3

Ich habe zwei Modelle A, BDjango: Zwei Tabellen und zusätzliches Feld für order_by aus der zweiten Tabelle mit

Mysql Abfrage ist

SELECT a.ID FROM a INNER JOIN b ON (a.ID = b.id) WHERE (b.key = 'vcount') AND (a.type = 'abc') AND (a.status = 'done') ORDER BY b.value+0 DESC LIMIT 0, 5 

// Hier wird B.Wert long Feld, so hinzugefügt 0 in Integer konvertieren, dann sortiert.

Ich brauche Django Abfrage für die gleiche.

Ich habe versucht, diese

A.objects.filter(b__key ="vcount",type = "abc",status = "done").order_by('-b__value')[:5] 

aber über Django Abfrage gibt falsche Ergebnis, da es von Ascii-Wert ist das Sortieren

So brauchen ‚Wert‘ Feld konvertieren dann müssen Integer sortieren .

Ich habe auch versucht, unter einem aber geben Fehler

xyz = A.objects.filter(b__key ="vcount",type = "abc",status = "done").extra(select={'value_int': "CAST(b__value AS UNSIGNED)"}).order_by('-value_int')[:5] 

Vorschläge oder Hilfe geschätzt wird.

+0

Was 'b_value' in Ihrem django Modell zu ändern? Dezimalfeld? – Sayse

+0

Die Verwendung von 'extra()' ist der richtige Ansatz, denke ich. Was ist der Fehler? – C14L

+0

b ist Modellname und Wert ist Feldname. Also wird b__value in order_by geschrieben. – Chandu

Antwort

0

Die .extra() Methode select nimmt SQL, daher sollte der Spaltenname als SQL b.value geschrieben werden.

xyz = A.objects.filter(b__key ="vcount",type = "abc",status = "done") 
     .extra(select={'value_int': "CAST(b.value AS UNSIGNED)"}) 
     .order_by('-value_int')[:5] 
0

Da ich ziemlich sicher bin, dies das Problem ist, ich es trotzdem schreiben werde ...

Ich vermute, dass value ein DecimalField ist, die für die Indizierung intern als String gespeichert wird Aus diesem Grund siehst du seltsame Ordnung.

Die Lösung ist die Art von Wert DecimalField-FloatField

Verwandte Themen