2009-12-26 9 views
7

Así que estoy sacando una lista de enlaces y estoy tratando de ordenar estos enlaces por popularidad. Estoy utilizando el algoritmo de Hacker News:Orden complejo en Django

 
Y Combinator's Hacker News: 
Popularity = (p - 1)/(t + 2)^1.5 

Votes divided by age factor. 
Where 

p : votes (points) from users. 
t : time since submission in hours. 

p is subtracted by 1 to negate submitter's vote. 
Age factor is (time since submission in hours plus two) to the power of 1.5.factor is (time since submission in hours plus two) to the power of 1.5. 

he logrado esto en MySQL y PHP un marco mediante el uso de una orden por

(SUM(votes.karma_delta) - 1)/POW((TIMESTAMPDIFF(HOUR, links.created, NOW()) + 2), 1.5) DESC 

Ahora estoy usando PostgreSQL y Django. Sé que este SQL exacto probablemente no funcionará pero puedo hacer la conversión más tarde. El problema al que me estoy enfrentando es que no sé cómo obtener un orden tan complejo en Byjango. Mi punto de vista tiene un perfecto:

popular_links = Link.objects.select_related().annotate(karma_total = Sum('vote__karma_delta')) 

Y yo realmente no quieren lodo que mediante el uso de SQL prima si no es necesario.

Para resumir mi pregunta: ¿cómo puedo crear un order_by complejo en Django?

EDITAR

Habrá paginación y en realidad sólo quieren ordenar las entradas Saco. ¿Es simplemente mejor hacer esa clasificación en Python?

Respuesta

5

ninguna manera limpia pero utilizando extra() con su SQL personalizado:

popular_links = Link.objects.select_related().annotate(karma_total = Sum('vote__karma_delta')) 
popular_links = popular_links.extra(
    select = {'popularity': '(karma_total - 1)/POW((TIMESTAMPDIFF(HOUR, links.created, NOW()) + 2), 1.5)',}, 
    order_by = ['-popularity',] 
) 
+0

parece que debería haber un wy para hacer esto con expresiones F? – JudoWill

+0

@JudiWIll ¿Qué significa? – TheLizardKing

+0

Esto me lanza una excepción: 'Caught a exception while rendering: la columna" karma_total "no existe LINE 1: SELECT ((karma_total - 1)) AS" popularidad "," links_link "." Id ... ' – TheLizardKing

0

Si va a extraer toda la lista de todos modos (es decir, no está tomando solo las primeras 10 entradas, por ejemplo), entonces puede hacer la clasificación en Python.

+0

Probablemente debería notar que tengo planes de paginación. – TheLizardKing