在 Django 中注释 SUM 聚合函数导致“None”值

2024-03-22

正在做我的第一个真正的 Django 项目,需要指导。

背景:我的项目是一个 reddit 克隆。用户提交链接+文本。访客投赞成票或反对票。有一个社交排名算法,作为后台脚本每约 2 分钟运行一次,根据净投票和内容的新鲜度对所有提交的内容重新排名。相当香草的东西。

Problem:订购依据votes无法正常工作,因为votes正在初始化为None代替0。这会导致提交None投票排名低于反对票的提交内容。我已经调试这个问题好几天了 - 没有运气。

规格:我已经重写了模型的模型管理器来注释Sum聚合函数到查询集,然后按“社会排名”和投票对所述查询集进行排序。

下面是我的模型.py。我在用着Django 1.5,因此您在这里看到的某些内容可能与 1.8 不对应(例如get_query_set vs get_queryset):

class LinkVoteCountManager(models.Manager):
    def get_query_set(self):
        return super(LinkVoteCountManager, self).get_query_set().annotate(votes=Sum('vote__value')).order_by('-rank_score', '-votes') 

class Link(models.Model):
    description = models.TextField(_("Write something"))
    submitter = models.ForeignKey(User)
    submitted_on = models.DateTimeField(auto_now_add=True)
    rank_score = models.FloatField(default=0.0)
    url = models.URLField(_("Link"), max_length=250, blank=True)

    with_votes = LinkVoteCountManager() 
    objects = models.Manager() 

    def __unicode__(self): 
        return self.description

    def set_rank(self):
        # Based on reddit ranking algo at http://amix.dk/blog/post/19588
        epoch = datetime(1970, 1, 1).replace(tzinfo=None)
        netvotes = self.votes # 'NONE' votes are messing up netvotes amount.
        if netvotes == None:
            netvotes = 0
        order = log(max(abs(netvotes), 1), 10)
        sign = 1 if netvotes > 0 else -1 if netvotes < 0 else 0
        unaware_submission = self.submitted_on.replace(tzinfo=None)
        td = unaware_submission - epoch 
        epoch_submission = td.days * 86400 + td.seconds + (float(td.microseconds) / 1000000)
        secs = epoch_submission - 1432201843
        self.rank_score = round(sign * order + secs / 45000, 8)
        self.save()

class Vote(models.Model):
    voter = models.ForeignKey(User)
    link = models.ForeignKey(Link)
    value = models.IntegerField(null=True, blank=True, default=0)

    def __unicode__(self):
        return "%s gave %s to %s" % (self.voter.username, self.value, self.link.description)

如果需要,以下是我的相关部分views.py:

class LinkListView(ListView):
    model = Link
    queryset = Link.with_votes.all()
    paginate_by = 10

    def get_context_data(self, **kwargs):
        context = super(LinkListView, self).get_context_data(**kwargs)
        if self.request.user.is_authenticated():
            voted = Vote.objects.filter(voter=self.request.user)
            links_in_page = [link.id for link in context["object_list"]]
            voted = voted.filter(link_id__in=links_in_page)
            voted = voted.values_list('link_id', flat=True)
            context["voted"] = voted
        return context

class LinkCreateView(CreateView):
    model = Link
    form_class = LinkForm

    def form_valid(self, form):
        f = form.save(commit=False)
        f.rank_score=0
        f.with_votes = 0
        f.category = '1'
        f.save()
        return super(CreateView, self).form_valid(form)

谁能告诉我我需要做什么来解决“None“问题?提前致谢。


就撞到了同一堵墙,虽然我选择忽略None通过将它们从结果中排除来删除条目。我猜你不想要这样。

顺便说一句,这个问题有同样的问题注释 Sum 会导致 None 而不是零 https://stackoverflow.com/questions/6160648/annotating-a-sum-results-in-none-rather-than-zero

至于除了使用该问题的答案中指出的自定义 sql 之外的解决方案,您可以使用 Django 1.8 代替,并寻求 Django 错误跟踪器中打开的票证中指出的解决方案超过 6 年(!)https://code.djangoproject.com/ticket/10929 https://code.djangoproject.com/ticket/10929

Coalesce(Sum('field'), 0)

所以你的经理会是:

class LinkVoteCountManager(models.Manager):
    def get_query_set(self):
        return super(LinkVoteCountManager, self).get_query_set().annotate(
            votes=Coalesce(Sum('vote__value'), 0)
        ).order_by(
            '-rank_score', 
            '-votes'
        )

PS:我没有测试代码,因为我自己没有使用 Django 1.8。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Django 中注释 SUM 聚合函数导致“None”值 的相关文章

随机推荐

  • Elastic Beanstalk -> 使用 Grails 的 RDS 连接错误

    我正在将 Grails 应用程序部署到 Amazon Web Services Elastic Beanstalk 并利用 RDS 我正在使用 Grails Spring Security RDS 表 该应用程序似乎工作正常 RDS 中的登
  • Flutter SDK 使用哪个渠道?

    预览版 1 的公告位于 宣布 Flutter 发布预览 1 Flutter Medium https medium com flutter io flutter release preview 1 943a9b6ee65a 下载 Flutt
  • 如何在 R 中进行条件“左连接”?

    我发现自己在 R 中多次执行 条件左连接 用一个例子来说明 如果您有两个数据框 例如 gt df a b 1 1 0 2 2 0 gt other df a b 1 2 3 目标是最终得到这个数据框 gt final df a b 1 1
  • 如何在另一个函数中使用 calc()

    是否可以使用calc CSS 函数内部 例如transform or translate 我似乎无法让它发挥作用 这是一个演示 大家可以玩一下 http jsfiddle net qdJwY 1 http jsfiddle net qdJw
  • 如何在 Ruby 中使用条件运算符 (?:)?

    条件运算符 在 Ruby 中使用 例如 这是正确的吗 它是三元运算符 http en wikipedia org wiki Ternary operation 其工作方式与 C 中类似 不需要括号 这是一个表达式 其工作原理如下 if th
  • C# ClickOnce 应用程序的“添加或删除程序”图标

    我已经尝试过Stack Overflow问题中的解决方案 添加或删除程序 中 ClickOnce 应用程序的自定义图标 https stackoverflow com questions 10927109 icon for click on
  • 有什么好的可视化 HTML5 编辑器或 IDE? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 看起来 Dreamweaver CS5 将在几年内 实际上是几周 尝试使 HTML5 变得更加流畅 似
  • Rails:嵌套资源冲突,如何根据调用的路由确定索引操作的范围

    假设您有两条定义的路线 map resources articles map resources categories has many gt articles 两者都可以通过助手 路径访问 articles path articles c
  • 切换列表字典中的键和值

    大家好 Stackoverflow 我有一个嵌套字典 其中列表作为值 我想创建一个字典 其中所有列表条目都将其相应的键作为值 举例时间 what I have dict1 A 1 2 3 B 4 5 6 C 7 8 9 what I wan
  • 检测请求是否是 ESI - Symfony2

    这可能是不可能的 如果是这种情况 那么我将不得不寻找其他解决方案 所以如果无法完成 请告诉我 我知道我可以获得请求类型 即 1 主请求或 2 子请求 但是有没有办法检测该请求是否是 ESI 请求 我的理解是ESI永远是一个子请求 但是有很多
  • “无法加载配置中指定的 X.509 证书身份”

    我将工作中的 WCF 服务从我的开发环境转移到 QA 环境 包括证书 根授权 根身份验证撤销列表 服务证书 包括其 PK 之后 我使用 FindPrivateKey 找到了私钥 并授予所有相关帐户在文件系统级别访问私钥文件的完全权限 我的应
  • 使用 jq 解析嵌套 json

    我正在解析嵌套的 json 以从 json 响应中获取特定值 json响应如下 custom classes 2 images classifiers classes class football score 0 867376 classi
  • 错误:无法为具有多个返回值的查询创建 TypedQuery

    我尝试用java和jpa来实现searchBook功能 我有两门课 即媒体课和图书课 书籍延伸了媒体 我将数据保存在不同的表中 我尝试从下面的查询中选择数据 TypedQuery
  • 如何分析 AngularJS 组件的性能基准?

    作为一项要求 我必须根据模拟数据分析几个 AngularJS 组件 例如 ng grid IE8 Chrome 和 FF 中的数据表 的性能基准 我有模拟数据 现在 当使用 IE8 Profiler 时 我得到了几个函数的时间 毫秒 根据
  • 使用 GHC 泛型定义类似“mempty”的函数?

    我正在为 Zoho REST API 编写一个客户端库 并且有一堆不同的记录类型 其中包含所有内容Maybe a字段 即 data Approval Approval apDelegate Maybe Bool apApprove Mayb
  • 在 IE 请求中设置 AJAX 内容类型标头

    从 Internet Explorer 发送跨域 jquery ajax http 请求时 是否可以将 http 内容类型请求标头设置为 application json 我们正在尝试使用 REST WCF 服务 该服务在格式化响应时解释请
  • 是否可以将 MPMoviePlayerController 静音?

    在我的 iPhone 应用程序中 我想要静音和取消静音 MPMoviePlayerController 我进行了很多搜索 但无法成功 是否可以在 MPMoviePlayer 控制器中将音频静音 请帮帮我 提前致谢 MPMusicPlayer
  • 如何使用 TYPO3 extbase Fluid 正确输出 DateTime

    我在数据库中存储了两个 dateTime 对象 2014 11 03 09 00 00 2014 10 21 13 45 00 当我尝试使用 ViewHelper format date 输出它们时
  • 无服务器 - 如何将多个文件添加到 iamRoleStatements?

    In my serverless yml文件 我希望能够添加iamRoleStatements来自两个不同的文件 这不能改变 所以我尝试这样做 provider iamRoleStatements file environments yml
  • 在 Django 中注释 SUM 聚合函数导致“None”值

    正在做我的第一个真正的 Django 项目 需要指导 背景 我的项目是一个 reddit 克隆 用户提交链接 文本 访客投赞成票或反对票 有一个社交排名算法 作为后台脚本每约 2 分钟运行一次 根据净投票和内容的新鲜度对所有提交的内容重新排