Реализация алгоритма популярности в Django

Я создаю сайт, подобный reddit и новостям хакера, которые имеют базу данных ссылок и голосов. Я реализую алгоритм популярности новостей хакера, и дела идут довольно без помех, пока он не приходит к фактическому собиранию этих ссылок и отображению их. Алгоритм прост:

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.

Я задал очень похожему вопросу вон там Сложное упорядочивание в Django, но вместо того, чтобы рассмотреть мои опции я выбираю один и попробованный, чтобы заставить его работать, потому что это - то, как я сделал это с PHP/MySQL, но я теперь знаю, что Django делает вещи существенно иначе.

Мои модели смотрят что-то (точно) как это

class Link(models.Model):
category = models.ForeignKey(Category)
user = models.ForeignKey(User)
created = models.DateTimeField(auto_now_add = True)
modified = models.DateTimeField(auto_now = True)
fame = models.PositiveIntegerField(default = 1)
title = models.CharField(max_length = 256)
url = models.URLField(max_length = 2048)

def __unicode__(self):
    return self.title

class Vote(models.Model):
link = models.ForeignKey(Link)
user = models.ForeignKey(User)
created = models.DateTimeField(auto_now_add = True)
modified = models.DateTimeField(auto_now = True)
karma_delta = models.SmallIntegerField()

def __unicode__(self):
    return str(self.karma_delta)

и мое представление:

def index(request):
popular_links = Link.objects.select_related().annotate(karma_total = Sum('vote__karma_delta'))
return render_to_response('links/index.html', {'links': popular_links})

Теперь от моего предыдущего вопроса, я пытаюсь реализовать алгоритм с помощью функции сортировки. Ответ от того вопроса, кажется, думает, что я должен поместить алгоритм в выбор и вид затем. Я собираюсь нумеровать страницы эти результаты, таким образом, я не думаю, что могу сделать сортировку в Python, не захватывая все. Какие-либо предложения о том, как я мог эффективно сделать это?

Править

Это еще не работает, но я думаю, что это - шаг в правильном направлении:

from django.shortcuts import render_to_response
from linkett.apps.links.models import *

def index(request):
popular_links = Link.objects.select_related()
popular_links = popular_links.extra(
    select = {
        'karma_total': 'SUM(vote.karma_delta)',
        'popularity': '(karma_total - 1) / POW(2, 1.5)',
    },
    order_by = ['-popularity']
)
return render_to_response('links/index.html', {'links': popular_links})

Это ошибки в:

Caught an exception while rendering: column "karma_total" does not exist
LINE 1: SELECT ((karma_total - 1) / POW(2, 1.5)) AS "popularity", (S...

РЕДАКТИРОВАНИЕ 2

Лучшая ошибка?

TemplateSyntaxError: Caught an exception while rendering: missing FROM-clause entry for table "vote"
LINE 1: SELECT ((vote.karma_total - 1) / POW(2, 1.5)) AS "popularity...

Мой index.html просто:

{% block content %}

{% for link in links %}
 
  
   karma-up
   {{ link.karma_total }}
   karma-down
  
  {{ link.title }}
  Posted by {{ link.user }} to {{ link.category }} at {{ link.created }}
 
{% empty %}
 No Links
{% endfor %}

{% endblock content %}

ОТРЕДАКТИРУЙТЕ 3 Настолько очень близко! Снова, все эти ответы являются большими, но я концентрируюсь на конкретном, потому что я чувствую, что он работает лучше всего на мою ситуацию.

from django.db.models import Sum
from django.shortcuts import render_to_response
from linkett.apps.links.models import *

индекс определения (запрос): popular_links = Ссылка objects.select_related () .extra (выбирают = {'популярность': '(СУММА (links_vote.karma_delta) - 1) / военнопленный (2, 1.5)'}, таблицы = ['links_link', 'links_vote'], order_by = ['-популярность']), возвращают render_to_response ('links/test.html', {'ссылки': popular_links})

Выполнение этого мне дарят ошибку при ненависти на моем отсутствии группы значения. Конкретно:

TemplateSyntaxError at /
Caught an exception while rendering: column "links_link.id" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: ...karma_delta) - 1) / POW(2, 1.5)) AS "popularity", "links_lin...

Не уверенный, почему мой links_link.id не был бы в моей группе, но я не уверен, как изменить мою группу, django обычно делает это.

7
задан Community 23 May 2017 в 11:53
поделиться