【问题标题】:problem ordering by votes with django-voting使用 django-voting 进行投票排序问题
【发布时间】:2010-10-07 08:57:33
【问题描述】:

我有一个模型帖子和一个模型投票。 Vote(表单 django-voting)本质上只是一个指向 Post 和 -1、0 或 1 的指针。

还有 Tourn,它是开始日期和结束日期。在锦标赛开始和结束之间发布的帖子将提交给该锦标赛。

为了计算声望,我试图找出锦标赛的前 3 名获胜者。这就是我所拥有的:

    posts = Post.objects.filter(status=2, created_at__range=(tourn.start_date, tourn.end_date))

    start = tourn.start_date - timedelta(days=1)
    end = tourn.end_date + timedelta(days=1)
    qn = connection.ops.quote_name
    ctype = ContentType.objects.get_for_model(Post)

    posts.extra(select={'score': """
            SELECT SUM(vote)
            FROM %s
            WHERE content_type_id = %s
            AND object_id = %s.id
            AND voted_at > DATE(%s)
            AND voted_at < DATE(%s)
        """ % (qn(Vote._meta.db_table), ctype.id, qn(Post._meta.db_table), start, end)},
                order_by=['-score'])

    if tourn.limit_to_category:
        posts.filter(category=tourn.category)

    if len(posts) >= 1:
        tourn_winners_1.append(posts[0].author)
        resp += " 1: " + posts[0].author.username + "\n"

    if len(posts) >= 2:
        tourn_winners_2.append(posts[1].author)
        resp += " 2: " + posts[1].author.username + "\n"

    if len(posts) >= 3:
        tourn_winners_3.append(posts[2].author)
        resp += " 3: " + posts[2].author.username + "\n"

看起来很简单,但由于某种原因,结果是错误的。

得到的查询是这样的:

SELECT "blog_post"."id", "blog_post"."title", "blog_post"."slug", "blog_post"."a
uthor_id", "blog_post"."creator_ip", "blog_post"."body", "blog_post"."tease", "b
log_post"."status", "blog_post"."allow_comments", "blog_post"."publish", "blog_p
ost"."created_at", "blog_post"."updated_at", "blog_post"."markup", "blog_post"."
tags", "blog_post"."category_id" FROM "blog_post" WHERE ("blog_post"."status" =
2  AND "blog_post"."created_at" BETWEEN 2008-12-21 00:00:00 and 2009-01-04 00:00
:00) ORDER BY "blog_post"."publish" DESC

似乎 posts.extra() 根本没有应用于查询...

【问题讨论】:

  • 您可以在完全构建查询集后发布调用“print posts.query”的结果吗?我认为看看已经串在一起的最终 SQL 可能会有所帮助。

标签: python django django-voting


【解决方案1】:

我认为您需要将posts 分配给posts.extra() 的返回值:

posts = posts.extra(select={'score': """
                    SELECT SUM(vote)
                    FROM %s
                    WHERE content_type_id = %s
                    AND object_id = %s.id
                    AND voted_at > DATE(%s)
                    AND voted_at < DATE(%s)
                """ % (qn(Vote._meta.db_table), ctype.id, qn(Post._meta.db_table), start, end)},
                        order_by=['-score'])

【讨论】:

  • 这是正确的,并且有效。但是,我现在仍然得到正确的订单。 :(
  • @defrex,它根本没有被排序吗?还是排序不当(方向错误)?请说得更具体一些。
  • 根本没有排序。每个帖子的分数都是无,所以没有什么比其他任何东西都高。
  • @defrex,尝试测试您的子查询,看看您得到什么回报。这可能会帮助您跟踪您的错误。
  • 哈哈。好的,所以您的原始答案是正确的。我没有得到任何分数的原因是因为我的开发环境正在使用上次锦标赛结束后导入的数据库版本,并且导入重置了所有日期。
猜你喜欢
  • 2012-10-29
  • 1970-01-01
  • 1970-01-01
  • 2011-02-26
  • 1970-01-01
  • 1970-01-01
  • 2017-02-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多