DjangoのORMを使用して2つのテーブルをプログラムで結合することは可能ですか?トピックと投票の2つのモデルがあります。私のテンプレートには、ユーザーがRedditのように上下投票できるトピックのリストがあります。結果の並べ替えを除いて、すべてが正常に機能します。各オブジェクトの投票数の合計であるスコアに基づいてオブジェクトリストを並べ替える方法がわかりません。問題なくpostgresから目的のデータを取得できます。
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;
目的の結果が返されます。
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
問題は、これをクエリセットとして取得する方法がわからないことです。現在、オブジェクトを表示するために以下を使用しています。
topic_list = Topic.objects.all()
並べ替え順序を除いて、すべてが希望どおりに表示されます。最高のスコアを最初に表示したいのですが。
私がすでに見たリソース:
https :
//docs.djangoproject.com/en/dev/topics/db/managers/#adding-extra-manager-methodsdjangoでGROUPBYとしてクエリする方法は?
そしてもっとたくさんありますが、新しいユーザーとして、スパム対策は私がそれらを追加することを防ぎます。
私が試したこと:
鎖:
listed_links = list(chain(topic, score))
残念ながら、ソートされた値を追加しようとすると、これは壊れました。
オブジェクトリストの組み合わせ:
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)
これにより、1つのリストに必要なすべてのオブジェクトが作成されましたが、にリンクする方法がわかりませんでしtopic.id
たscore.object_id
。
生のSQLも挿入してみましたが、正しく挿入されているとは思えず、サードパーティによるSQLインジェクションにつながる可能性があります。
この結果をdjango-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
=============トピックモデル========================
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