Django вызывает функцию просмотра без запроса в шаблоне - PullRequest
3 голосов
/ 04 июля 2010

Я делаю несколько функций просмотра, чтобы вычислить рейтинг одного пользователя в сообществе. Моя проблема в том, что я хочу отобразить рейтинг, привязанный к каждому пользователю, в своем профиле, и я не знаю как, поскольку у меня нет запроса и render_to_response (потому что я догадался, что они не нужны) мой код:

def calculate_questions_vote(request):
    useranswer = Answer.objects.filter (answer_by = request.user)
    positive_votes = VoteUpAnswer.objects.filter(answer = useranswer)
    negative_votes = VoteDownAnswer.objects.filter(answer = useranswer)
    question_vote_rank = sum(positive_votes) - sum(negative_votes.count)
        return question_vote_rank

def calculate_replies(request):
    the_new = News.objects.filter(created_by = request.user)
    reply = Reply.objects.filter(reply_to = the_new)
    reply_rank = sum(reply)
        return reply_rank

def calculate_votes(request):
    the_new = News.objects.filter(created_by = request.user)
    vote = Vote.objects.filter(voted = the_new)
    vote_rank = sum(vote)
        return vote_rank

def personal_rank(request):
    personal_rank = question_vote_rank + reply_rank + vote_rank
        return personal_rank

и в пользовательских профилях:

user = request.user  
personal_rank = calculate_questions_vote(user) + calculate_replies(user) + personal_rank(user)

но моя ошибка:

Ошибка привязки параметра 0 - возможно, неподдерживаемый тип.

Верен ли подход mt? Как мне вызвать функцию ранга в определении profile_view?

Спасибо!

Ответы [ 2 ]

5 голосов
/ 04 июля 2010

Вы можете вызвать функцию в вашем представлении как rank = personal_rank(reuest.user) и затем добавить rank в ваш контекст.
Я бы не назвал эту функцию «view» -функциями, поскольку они не имеют дело с запросом и не возвращают HttoResponce; они являются более «вспомогательными» функциями и также не относятся к модели, если имеют дело с отдельными объектами (например, News & Голосование). Место спуска для них было бы, например. utils.py. Вы импортируете их оттуда в views.py и вызываете их с пользователем в качестве параметра (если это фактический пользователь, то это request.user).
Имеет смысл, что вы не можете получить доступ к request отовсюду, потому что это заставляет вас больше ориентироваться на дизайн, похожий на mvc, если вам нужен запрос где-то, вам нужно передать его из исходной функции просмотра! Вы должны изменить свою последнюю функцию на:

def personal_rank(user):
    personal_rank = calculate_questions_vote(user) + \
                    calculate_replies(user) + \
                    calculate_votes(user)
    return personl_rank

Вы также можете добавить эту последнюю функцию в свой класс модели User или UserProfile, если у вас есть что-то подобное, а затем вызвать, например,. my_user.personal_rank() или my_user.get_profile().personal_rank().

3 голосов
/ 04 июля 2010

Лазерная наука дала хорошее объяснение вашему предположению.Я просто хочу указать на некоторые возможные проблемы с производительностью.

Обратите внимание, что вызов этого метода для каждого пользователя дает 7 запросов.Если ваш случай будет показывать рейтинг для всех пользователей, это может занять много времени.Я предлагаю сделать кэширование (как в StackOverflow).Здесь есть много опций, например, вы можете назначить специальное поле rank для модели User (или UserProfile, если User равно auth.User), в которой вы можете хранить предварительно рассчитанный ранг (рассчитывается толькопосле некоторой операции, такой как сохранение новостей или через определенные промежутки времени).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...