【问题标题】:Calculate field and order by the calculated field计算字段并按计算字段排序
【发布时间】:2016-03-06 18:55:42
【问题描述】:

我有以下型号:

class Question(models.Model):
    Title = models.CharField(max_length=250)
    User = models.ForeignKey(User)

    def GetVotes(self):
        return Vote.objects.filter(Question=self).aggregate(Sum('Vote'))['Vote__sum']

class Vote(models.Model):
    Question = models.ForeignKey(Question)
    User = models.ForeignKey(User)
    Vote = models.IntegerField()

Question 模型中可以看出,我使用自定义方法来计算每个问题的投票。我这样做是因为我想将投票与实际问题分开,因此我不想在 Question 模型和 Vote 中保留投票计数器,因为以后很难维护。

根据良好的设计,不应存储可计算的信息。

我现在可以很好地找到每个问题的投票,但问题归结为order_by。我想得到所有的问题,并按他们的投票排序。据我所知,这是不可能的,因为 order_by() 已下降到数据库级别,而我的方法不在数据库级别。

我想找到一个很好的方法来做到这一点,而不使用ORM以外的其他技术,这可能吗?

编辑:
使用 ORM 似乎没有什么好的方法,所以我使用 sorted 实现了。

【问题讨论】:

  • 我细注释应该做你想做的,看到这个答案:stackoverflow.com/questions/2501149/…
  • 感谢您的评论@ger.s.brett。在提出问题之前,我已经遇到过这个解决方案,但我发现这个解决方案的唯一困难是两个模型之间应该有一个join,这样我才能实现这一点。

标签: django orm django-1.9


【解决方案1】:

由于 order_by 是在数据库级别应用的,因此无法做到这一点。

但你有两种选择:

  1. 创建一个字段来存储计算的值并覆盖写入方法,以便您可以在那里计算值
  2. 按照answer 所示对查询集进行排序

【讨论】:

  • 感谢您的回答。我正在考虑使用view 表而不是将数据存储在Question 模型中,但我不确定Django 是否可以这样做。
【解决方案2】:

您可以注释要排序的数据,然后按该值排序。

Question.objects.annotate(vote_count=Sum('vote_set__vote')).order_by('vote_count')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-26
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    • 2016-01-11
    • 2021-02-02
    • 1970-01-01
    相关资源
    最近更新 更多