2016-04-17 9 views
0

Ich habe eine Funktion, die ein Objekt id übernimmt. Mit dieser ID kann ich das Objekt einer Tabelle object_1 = Object.objects.get(pk=id) bekommen. Ich würde gerne die Object Tabelle nach einer Position namens Votes geordnet haben. Zum Beispiel, objects = Object.objects.order_by('-votes') und ich würde gerne die Position von object_1 in objects finden.Django Abfrage geordnete Objekte gegeben Position

Wie konnte ich das erreichen? Soweit ich weiß, ist der Abfragesatz keine Liste, und ich müsste über alle Elemente iterieren, was ein großes Leistungsproblem darstellen würde, wenn ich viele Einträge in der Tabelle hätte.

Die Purpose von all dem ist, um eine nach Stimmen sortierte Rangordnung anzuzeigen, in der ich nur 6 Einträge zeige und die vierte sollte die des Objekts sein. Zum Beispiel, wenn ich für das Objekt gesucht 1, soll ich dies zeigen:

Position | Name | Votes 
    5  obj5  52 
    6  obj3  49 
    7  obj10 49 
    8  obj1  47 
    9  obj15 15 
    10  obj6  14 

So würde Ich mag eine Abfrage mit obj5,obj3,obj10,obj1,obj15,obj6 in dieser Reihenfolge gesetzt bekommen. Die optimale Lösung wäre etwas wie: objects = Object.objects.order_by('-votes')[x-4:x+2] wo x ist die Position des Objekts, das ich suche.

ps: Ich verwende Python 2.7.9 und Django 1.9

Antwort

0

Sie die Position des Objekts mit einer einfachen Abfrage der Anzahl finden können - etwa so:

object_1 = Object.objects.get(pk=id) 

# Count how many items have more votes than this one 
# This effectively tells you the position in your ordered list 
position = Object.objects.filter(votes__gt=object_1.votes).count() 

# Now generate your list of nearby objects 
objects = Object.objects.order_by('-votes')[position-4:position+2] 

(Hinweis: Diese Beispiel müsste für position < 4 optimiert werden.Sie benötigen auch einige Logik, um deterministische Reihenfolge in Fällen sicherzustellen, in denen Objekte die gleiche Anzahl von Stimmen haben.)

+0

Dies wird für jetzt tun, danke! – lpares12