2009-02-13 2 views
1

У меня есть модель Post, а также модель Vote. Голосование (форма django-голосования) по существу является указателем на сообщение и -1, 0 или 1.проблема с выбором голосов с django-vote

Существует также Tourn, который является датой начала и датой окончания. На этот турнир отправляется сообщение, сделанное между началом и окончанием Tourn.

Для расчета rep, я пытаюсь найти 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() не получает применяется к запросу на всех ...

+0

Можете ли вы опубликовать результаты вызова «печати posts.query» после того, как вы полностью построили свой набор запросов? Я думаю, что это может помочь увидеть окончательный SQL, который был натянут вместе. –

ответ

3

Я думаю, вам нужно назначить 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']) 
+0

это было правильно, и работал. Однако я все еще получаю правильный порядок. :( – defrex

+0

@defrex, разве он не сортируется вообще? Или он сортируется ненадлежащим образом (неправильное направление)? Будь более конкретным, пожалуйста. – strager

+0

Это не сортировка вообще. Оценка за каждый пост - None, поэтому ничего не занимает выше, чем что-либо еще. – defrex