2009-07-19 5 views
1

この作業コードを簡略化する方法はありますか? このコードは、すべての異なる投票タイプのオブジェクトを取得します。可能な限り20あり、それぞれのタイプをカウントします。 私はraw SQLを書くのではなく、ormを使用する方が好きです。このモデルでは汎用の外部キーを使用するため、少し難解です。raw SQLをdjango ormにマップ

def get_object_votes(self, obj): 
    """ 
    Get a dictionary mapping vote to votecount 
    """ 
    ctype = ContentType.objects.get_for_model(obj) 

    cursor = connection.cursor() 
    cursor.execute(""" 
     SELECT v.vote , COUNT(*) 
     FROM votes v 
     WHERE %d = v.object_id AND %d = v.content_type_id 
     GROUP BY 1 
     ORDER BY 1 """ % (obj.id, ctype.id) 
    ) 
    votes = {} 

    for row in cursor.fetchall(): 
     votes[row[0]] = row[1] 

    return votes 

モデルは

class Vote(models.Model): 
    user = models.ForeignKey(User) 

    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField() 
    payload = generic.GenericForeignKey('content_type', 'object_id') 

    vote = models.IntegerField(choices = possible_votes.items()) 


class Issue(models.Model): 
    title = models.CharField(blank=True, max_length=200) 

答えて

1

以下のコードは私のためのトリックをやりました!

def get_object_votes(self, obj, all=False): 
    """ 
    Get a dictionary mapping vote to votecount 
    """ 
    object_id = obj._get_pk_val() 
    ctype = ContentType.objects.get_for_model(obj) 
    queryset = self.filter(content_type=ctype, object_id=object_id) 

    if not all: 
     queryset = queryset.filter(is_archived=False) # only pick active votes 

    queryset = queryset.values('vote') 
    queryset = queryset.annotate(vcount=Count("vote")).order_by() 

    votes = {} 

    for count in queryset: 
     votes[count['vote']] = count['vcount'] 

    return votes 
0

はい、間違いなくORMを使用するを使用してイム。 、そして、対象物からの投票のすべてを取得するために

class Obj(models.Model): 
    #whatever the object has 

class Vote(models.Model): 
    obj = models.ForeignKey(Obj) #this ties a vote to its object 

これらDjangoはあなたのビュー関数の一つであることを呼び出しますがあります:あなたが本当にやるべきことはあなたのモデルでこれです

obj = Obj.objects.get(id=#the id) 
votes = obj.vote_set.all() 

からそれを数える方法を見るのはかなり簡単です(投票というリストの長さを得る)。

ドキュメントから多対1の関係について読むことをお勧めします。これは非常に便利です。

http://www.djangoproject.com/documentation/models/many_to_one/

+0

投票オブジェクトは、世代別のキーを使用しています。どのオブジェクトでも投票できるようにしたいと思います。私はモデルコードも追加します。 – Stephan

+0

あなたは外国関係を調査したと思いますか?彼らは、あなたが望む特定のオブジェクトを直接作成させることができます。そのような例は、答えを持っているようです。 http://www.djangoproject.com/documentation/models/generic_relations/ – AlbertoPL

関連する問題