Django中的通用评分
项目描述
一个通用的评分模块。出于优化原因,该字段本身在模型上附加了两个额外字段。它添加了 <field>_score 和 <field>_votes 字段,它们都是整数字段。
安装
您需要将 djangoratings 添加到您的 INSTALLED_APPS
INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'djangoratings', )
最后,在您的应用程序目录中运行 python manage.py syncdb 以创建表。
设置您的模型
django-ratings 的构建方式要求您将 RatingField 附接到您的模型上。该字段将创建两列,一列是投票列,另一列是评分列。它们都将使用您的字段名作为前缀
from djangoratings.fields import RatingField class MyModel(models.Model): rating = RatingField(range=5) # 5 possible rating values, 1-5
或者您可以这样做
from djangoratings.fields import AnonymousRatingField class MyModel(models.Model): rating = AnonymousRatingField(range=10)
如果您想使用内置的加权方法,使对象获得更高的评分更困难,您可以使用 weight 参数
class MyModel(models.Model): rating = RatingField(range=10, weight=10)
RatingField 允许以下选项
range = 2 - 接受值的范围。例如,2 的范围表示有 2 个可能的投票评分。
can_change_vote = False - 允许修改已投的票。
allow_delete = False - 允许删除现有投票。仅在 can_change_vote = True 时有效
allow_anonymous = False - 是否允许匿名投票。
use_cookies = False - 使用 COOKIES 来验证用户投票。仅在 allow_anonymous = True 时有效。
使用模型API
添加投票也很简单
myinstance.rating.add(score=1, user=request.user, ip_address=request.META['REMOTE_ADDR'], request.COOKIES) # last param is optional - only if you use COOKIES-auth
检索投票同样简单
myinstance.rating.get_rating_for_user(request.user, request.META['REMOTE_ADDR'], request.COOKIES) # last param is optional - only if you use COOKIES-auth
新功能 您还可以删除现有的投票(如果启用了删除功能)
myinstance.rating.delete(request.user, request.META['REMOTE_ADDR'], request.COOKIES) # last param is optional - only if you use COOKIES-auth
获取关于对象评分的信息也很简单
# these do not hit the database myinstance.rating.votes myinstance.rating.score
如何使用算法按最高评分排序(以下为来自Nibbits.com的示例)
# In this example, ``rating`` is the attribute name for your ``RatingField`` qs = qs.extra(select={ 'rating': '((100/%s*rating_score/(rating_votes+%s))+100)/2' % (MyModel.rating.range, MyModel.rating.weight) }) qs = qs.order_by('-rating')
获取您实例的整体评分范围[0-评分]
myinstance.rating.get_rating()
获取您实例的最新评分
# This returns ``Vote`` instances. myinstance.rating.get_ratings()[0:5]
获取投票者批准的百分比
myinstance.rating.get_percent()
获取相同的百分比,但不包括您的权重
myinstance.rating.get_real_percent()
通用视图:处理投票
使用通用视图的最佳方式是扩展它,或在您的代码中调用它
from djangoratings.views import AddRatingFromModel urlpatterns = patterns('', url(r'rate-my-post/(?P<object_id>\d+)/(?P<score>\d+)/', AddRatingFromModel(), { 'app_label': 'blogs', 'model': 'post', 'field_name': 'rating', }), )
另一个示例,在Nibbits上,我们使用基本的API接口,并在我们的视图中简单地调用AddRatingView
from djangoratings.views import AddRatingView # For the sake of this actually looking like documentation: params = { 'content_type_id': 23, 'object_id': 34, 'field_name': 'ratings', # this should match the field name defined in your model 'score': 1, # the score value they're sending } response = AddRatingView()(request, **params) if response.status_code == 200: if response.content == 'Vote recorded.': request.user.add_xp(settings.XP_BONUSES['submit-rating']) return {'message': response.content, 'score': params['score']} return {'error': 9, 'message': response.content}
限制每个IP地址的投票次数
0.3.5新增:现在有一个设置,RATINGS_VOTES_PER_IP,用于限制每个对象/评分字段组合的唯一IP数量。如果您有用户注册多个账户来对一个对象进行投票的问题,这将很有用。
RATINGS_VOTES_PER_IP = 3