我想使用Django建立一个简单的热门问题列表。我有一个function,它基于一些参数来评估每个问题的“ hotness ”。
函数看起来与此类似(full function here)
def hot(ups, downs, date):
# Do something here..
return hotness
我的问题和投票模型(相关部分)
class Question(models.Model):
title = models.CharField(max_length=150)
body = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
class Vote(models.Model):
question = models.ForeignKey(Question, related_name='questions_votes')
delta = models.IntegerField(default=0)
现在,
delta attribute
是正数或负数。热功能会收到正面投票数和负面投票数以及问题的创建日期。我已经尝试过类似的方法,但是它不起作用。
questions = Question.objects.annotate(hotness=hot(question_votes.filter(delta, > 0),question_votes.filter(delta < 0), 'created_at')).order_by('hotness')
我收到的错误是:
global name 'question_votes' is not defined
我理解错误,但是我没有正确的方法。 最佳答案
您不能将python函数用于注释。注释是在数据库级别完成的计算。 Django仅向您提供一组可以由数据库处理的基本计算-SUM,AVERAGE,MIN,MAX等...对于仅来自版本1.8的更复杂的内容,我们有一个用于更复杂的query expressions的API。在Django 1.8之前,实现类似功能的唯一方法是使用.extra,这意味着编写纯SQL。
因此,您基本上有两个半选择。
一年半
如果您的Django版本> = 1.8,则使用.extra
或通过新的API以普通SQL编写热度计算。
第二。
在模型内部创建热点字段,该字段将由cron作业每天一次(或根据您的需要更频繁地)进行计算。并根据您的需要使用它(最热门的列表)。
关于python - Django自定义注释功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30416270/