我想使用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/

10-11 23:09
查看更多