使用自定义趋势算法而不是模型字段订购模型行

时间:2013-09-30 01:09:55

标签: django django-models

我有以下型号

class Dishes(models.Model):
    name = models.CharField(max_length=40, unique=True)
    date_added = models.DateTimeField(auto_now_add=True)
    #increment/decrement with upvote added or removed
    count_votes = models.IntegerField(blank=True, null=True, default=0)

class Upvotes(models.Model):
    dish = models.ForeignKey(Dishes)
    user = models.ForeignKey(User)
    date_added = models.DateTimeField(auto_now_add=True)

我有3种菜肴,前2种是由date_added& count_votes,很容易用dishes.order_by(' - count_votes')和dishes.order_by(' - date_added')实现,第三种是“趋势排序”,我基本上想要将菜肴排列为一种随着时间的推移,upvotes的功能,任何想法我怎么能这样做?

1 个答案:

答案 0 :(得分:1)

听起来你正在寻求实施“趋势”算法。

有很多关于这个主题的文章,你不是第一个提出这个问题的人。查看thisthis,明确考虑使用一些预先构建的软件包,我发现django-trendingdjango-voting可能会对您有所帮助。

修改

Django允许使用注释进行复杂排序,但这仅限于内置聚合函数,如Avg,Sum等(您可以阅读here的方法)。因此,没有特定于django的方法来使用自定义方法进行订购。

但是,这并不意味着你不能用python做到这一点:

sorted(Dishes.objects.all(), key=lambda x: x.trending_method())

我不能说它将如何与大型数据库相提并论,但这是除了使用原始SQL之外我唯一知道的方式(这也是一个可选的,虽然令人厌烦的解决方案)。希望有所帮助!