问题 Django自定义注释功能


我想用Django构建一个简单的热门问题列表。我有一个 功能 评估““基于一些论点的每个问题。

功能看起来与此类似(这里功能齐全

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
我理解错误,但我没有正确的方法。


4624
2018-05-23 18:36


起源



答案:


您不能使用python函数进行注释。注释是在数据库级别上完成的计算。 Django只提供了一组可以由数据库处理的基本计算 - SUM,AVERAGE,MIN,MAX等等...对于仅从1.8版开始的更复杂的东西,我们有一个更复杂的API 查询表达式。在Django 1.8之前,实现类似功能的唯一方法就是使用 。额外 这意味着编写纯SQL。

所以你基本上有两个半选项。

一个半月。

使用。在纯SQL中编写热度计算 .extra 或者,如果您的Django版本> = 1.8,则通过新API。

第二。

在您的模型中创建热点字段,该字段将由cron作业每天计算一次(或者更多地取决于您的需要)。并根据您的需求使用它(最热门的列表)。


13
2018-05-23 19:01