Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • Home
  • SEARCH
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 8145455
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: June 6, 20262026-06-06T13:40:01+00:00 2026-06-06T13:40:01+00:00

Is is possible to programatically join two tables using Django’s ORM? I have two

  • 0

Is is possible to programatically join two tables using Django’s ORM? I have two models: Topics and Votes. On my template I have a list of topics that users can up/down vote like Reddit. Everything works as it should except for sorting the results. I cannot figure out how to sort an objects list based off the score which is a sum of each object’s vote count. I can retrieve the desired data from postgres without any issue:

select i.id, i.title, i.date_created, s.object_id, s.vote, Sum(vote) 
from topic_topic i, votes s 
where i.id = s.object_id 
group by 1, 2, 3, 4, 5 
order by sum DESC;

It returns the desired results:

id | title  |         date_created          | object_id | vote | sum 

11 | sdfg   | 2012-06-04 23:30:17.805671-07 |        11 |    1 |   2

 1 | test   | 2012-05-13 17:03:24.206092-07 |         1 |    1 |   2

 3 | asdf   | 2012-05-13 19:23:15.059135-07 |         3 |    1 |   2

 2 | adsf   | 2012-05-13 19:21:34.180905-07 |         2 |    1 |   2

12 | 11     | 2012-06-04 23:30:54.759158-07 |        12 |    1 |   2

 9 | asfd   | 2012-05-24 00:26:26.705843-07 |         9 |   -1 |  -1

 4 | asdf   | 2012-05-14 19:59:52.450693-07 |         4 |   -1 |  -2

The problem is, I am not sure how to retrieve this as a queryset. At the moment I am using the following to display objects:

topic_list = Topic.objects.all()

Everything displays as I would like it to, except for the sort order. I would like the highest score to display first.

Resources I have already looked at:
https://docs.djangoproject.com/en/dev/topics/db/managers/#adding-extra-manager-methods
How to query as GROUP BY in django?

And many more, but as a new user, anti-spam prevents me from adding them.

Thing’s I’ve tried:

Chain:

listed_links = list(chain(topic, score))

Unfortunately, if I tried to add a sorted value this broke.

Combining object lists:

topic = Topic.objects.all().values_list('user','id', 'title','slug', 'date_created', 'date_updated',)

score = Vote.objects.values('object_id').annotate(total=Sum('vote')).order_by('-total')

results = []

for topic in topic:
results.append(topic)

for score in score:
results.append(topic)

This resulted in all the objects I wanted in one list, but I could not figure out how to link topic.id to score.object_id.

I’ve also tried inserting raw SQL, but I don’t feel like I am doing it correctly, and could lead to SQL injection by a third party.

I would love to share the results of this back to the django-voting project. Like I said, everything works as it should, except I cannot figure out how to sort by score desc.

=============Voting========================

from django.contrib.contenttypes import generic

from django.contrib.contenttypes.models import ContentType

from django.contrib.auth.models import User

from django.db import models

from voting.managers import VoteManager

from voting.VotedObjectsManager import VotedObjectsManager

    SCORES = (
    (+1, u'+1'),
    (-1, u'-1'),
)

class Vote(models.Model):

    """
    A vote on an object by a User.
    """

    user         = models.ForeignKey(User)

    content_type = models.ForeignKey(ContentType)

    object_id    = models.PositiveIntegerField()

    object       = generic.GenericForeignKey('content_type', 'object_id')

    vote         = models.SmallIntegerField(choices=SCORES)

    objects      = VoteManager()


    class Meta:
        db_table = 'votes'
        # One vote per user per object
        unique_together = (('user', 'content_type', 'object_id'),)

    def __unicode__(self):
        return u'%s: %s on %s' % (self.user, self.vote, self.object)

    def is_upvote(self):
        return self.vote == 1

    def is_downvote(self):
        return self.vote == -1

=============Topic Model========================

from django.db import models

from datetime import datetime

from tinymce import models as tinymce_models

from django.forms import ModelForm

from django.template.defaultfilters import slugify

from tagging.fields import TagField

from tagging.models import Tag

from django.contrib.auth.models import User

from django.utils.translation import ugettext_lazy as _

from django.contrib.contenttypes.models import ContentType

from django.contrib.contenttypes import generic

from django.core import urlresolvers

    class Topic(models.Model):

    title           = models.CharField(max_length=50)

    slug            = models.SlugField(max_length=50, editable=False)

    topic         = tinymce_models.HTMLField()

    date_created    = models.DateTimeField(editable=False)

    date_updated    = models.DateTimeField(editable=False)

    tags            = TagField()


    def set_tags(self, tags):
        Tag.objects.update_tags(self, tags)    

    def __unicode__(self):
        return self.tags

    def __unicode__(self):
        return self.id

    def __unicode__(self):
        return self.title
  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-06-06T13:40:03+00:00Added an answer on June 6, 2026 at 1:40 pm

    I was able to figure out the solution using a patch as described here:

    http://code.google.com/p/django-voting/issues/detail?id=10

    The difference was that I extracted the following lines:

        def select_score(self):
        """ Add vote scores for objects in resoultset """
        from django.contrib.contenttypes.models import ContentType
        model_type = ContentType.objects.get_for_model(self.model)
        table_name = self.model._meta.db_table
        print type(model_type)
        print model_type.id
        return self.extra(select={'score': 'SELECT SUM(vote) FROM votes WHERE content_type_id=%i AND object_id=%s.id' % (int(model_type.id), table_name)})
    

    And added them to the voting/managers.py file as so:

    class VoteManager(models.Manager):
    def get_score(self, obj):
        """
        Get a dictionary containing the total score for ``obj`` and
        the number of votes it's received.
        """
        ctype = ContentType.objects.get_for_model(obj)
        result = self.filter(object_id=obj._get_pk_val(),
                             content_type=ctype).extra(
            select={
                'score': 'COALESCE(SUM(vote), 0)',
                'num_votes': 'COALESCE(COUNT(vote), 0)',
        }).values_list('score', 'num_votes')[0]
    
        return {
            'score': int(result[0]),
            'num_votes': int(result[1]),
        }
    

    Then In my topic.views.py I added the following:

    from voting.managers import VoteManager
    def index(request):
    queryset = Topic.objects.select_score().order_by('-score')
    paginator = Paginator(queryset, 3) # Show 25 contacts per page
    
    page = request.GET.get('page')
    try:
        topic_list = paginator.page(page)
    except PageNotAnInteger:
        # If page is not an integer, deliver first page.
        topic_list = paginator.page(1)
    except EmptyPage:
        #If page is out of range (e.g. 9999), deliver last page of results.
        topic_list = paginator.page(paginator.num_pages)
    
    c = Context({
    'topic_list': topic_list,
    'request': request
    })
    return render_to_response('idea/index.html', c, context_instance=RequestContext(request))
    

    Lastly, in my index.html I added the following lines slightly deviating from the original example provided for users:

    {% load voting_tags %}
    {% votes_by_user user on topic_list as vote_dict %}
    {% scores_for_objects topic_list as score_dict %}
    
    <table id="voting_table" class="list">
    <tbody>
      {% for link in topic_list %}
    <td class="vote">
    
    {% dict_entry_for_item link from vote_dict as vote %}
    {% dict_entry_for_item link from score_dict as score %}
    
    <div>    
     <form class="linkvote" id="linkup{{ link.id }}"{% if vote and vote.is_upvote %} action="{% url link_vote object_id=link.id, direction="clear" %}"{% else %} action="{% url link_vote object_id=link.id, direction="up" %}"{% endif %} method="POST">
        <input type="image" id="linkuparrow{{ link.id }}" src="{{ STATIC_URL }}images/aup{% if vote and vote.is_upvote %}mod{% else %}grey{% endif %}.png">
        {% csrf_token %}
        <input type="hidden" name="next" value="{{ request.get_full_path }}"/>
        {% else %}
    
      </form>
    
           <div id="link_score">{{ score.score|default:0 }}</div>
    
      <form class="linkvote" id="linkdown{{ link.id }}" {% if vote and vote.is_downvote %} action="{% url link_vote object_id=link.id, direction="clear" %}"{% else %} action="{% url link_vote object_id=link.id, direction="down" %}"{% endif %} method="POST">
      {% csrf_token %}
        <input type="image" id="linkdownarrow{{ link.id }}" src="{{ STATIC_URL }}images/adown{% if vote and vote.is_downvote %}mod{% else %}grey{% endif %}.png">
         <input type="hidden" name="next" value="{{ request.get_full_path }}"/>
    
    </td>
    <td class="item">
      <a id="link_title" href="{{ link.id }}">{{ link.title|escape }}</a></h2>
      <p class="details">
        <span class="score" id="linkscore{{ link.id }}"
              title="after {{ score.num_votes|default:0 }} vote{{ score.num_votes|default:0|pluralize }}">
        </span>
        posted {{ link.date_created|timesince }} ago by
        <span class="user"><a href="../users/{{ link.user.id }}/">{{ link.owner|escape }}</a></span>
    {% get_comment_count for link as comment_count %}
        <span id="comment_score" class="comment_details"> {{ comment_count }} comment{{ comment_count|pluralize }}</span>
      </p>
    </td>
    </tr>{% endfor %}
    </tbody>
      <td>
        <div id="paginator" class="pagination">
        <span class="step-links">
            {% if topic_list.has_previous %}
                <a href="?page={{ topic_list.previous_page_number }}">previous</a>
        {% endif %}
        {% if topic_list.has_next %}
            <a href="?page={{ topic_list.next_page_number }}">next</a>
        {% endif %}
        </span>
        </div>
      </td>
    </table>
    

    EDIT

    I almost forgot! If you would like the list to sort in an order like 2,1,0,-1,-2 make sure to set the vote object value upon submitting whatever object you are creating. The example below is from my topic.views.py.

    def submit_topic(request):
    
    if request.method == 'POST':
        post_topic = PosttopicForm(request.POST)
        owner = request.user
        if post_topic.is_valid():
            topic = post_topic.save(commit=False)
            topic.owner = request.user
            topic.save()
            vote = Vote(vote='0', user = request.user, content_type_id=10, object_id=topic.pk)
            vote.save()
            url = reverse('topic', args=[topic.pk, topic.slug])
            return HttpResponseRedirect(url)
    else:
        post_topic = PosttopicForm()
    
    c = Context({
        'form': post_topic,
        'user': request.user,
        'request': request,
    

    })

    return render_to_response('topic/submit.html', c, context_instance=RequestContext(request))
    

    I really hopes this helps someone else. Sorry for not posting the solution sooner. Hopefully someone can improve this by getting rid of the SQL all together from the VoteManager, but I need to move forward.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

Possible Duplicate: How to block a website programatically using DotNet HAI I am developing
Is it possible to change theme programatically using JDE 4.5 ?
Is it possible to determine programatically whether any background applications/services are using the sattelite
Possible Duplicate: programatically get the file size from a remote file using delphi, before
Is it possible to programatically authenticate a user using NTLM (on asp.net)? I would
Using spring 3.0 MVC: Is it possible to programatically execute a controller's action, and
Is it possible to programatically transffer the data between iPhone and iPad using bluettoth?
Is it possible to programatically find the free space available in mapped drives? How
is it possible to programatically increase the JVM android machine to 10MB? If yes
Possible Duplicate: Any way to add HttpHandler programatically in .NET? Is there a way

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.