1
我有一個模型發佈,和一個模型投票。票(形式django的表決權)是本質上只是一個指向柱和-1,0或1。通過投票Django-voting排序問題
還有Tourn,這是起始日期和結束日期。在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()不獲取應用於查詢在所有...
你可以發佈後你叫「打印posts.query」的結果已經完全構造查詢集?我認爲這可能有助於查看已經串聯在一起的最終SQL。 – 2009-02-13 13:30:28