2011-07-06 15 views
0

私は私のビューのいずれかでフィルタを考え出すの問題を抱えています。私は、ブログエントリ、ニュース記事、およびレビューでサイトを作成しています。エントリーと記事は、レビューがどちらのタグにもタグを付けることができるため、レビューと一般的な関係を持ちます。私は何をしようとしていること評価特定の日付より新しい口コミの合計に基づいてエントリ/記事をソートすることです。ここで Djangoの一般的な関係の問題

は単純化されたモデルです。だから、私は合計を見つけるために必要なことを考えると

class Entry(models.Model): 
    name = models.CharField(max_length=50) 
    reviews = generic.GenericRelation(Review) 

class Article(models.Model): 
    name = models.CharField(max_length=50) 
    reviews = generic.GenericRelation(Review) 

class Review(models.Model): 
    rating = models.IntegerField() 
    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField() 
    target = generic.GenericForeignKey('content_type', 'object_id') 
    timestamp = models.DateTimeField(auto_now_add=True) 

は、私が注釈を付けると集計使ってみましたが、私は2つの問題に遭遇しました。最初の1つは明らかに一般的な関係であり、アノテーションは一緒にうまく機能しません:https://code.djangoproject.com/ticket/10461。 2番目の問題は、レビューの一部(この場合、timestamp__gte = datetime.now())を合計するだけでは不十分だと思うということです。私はこれを間違った方法でやっていますか?そう私ができる

Review.filter(timestamp__gte=datetime.now(), target__in=something).aggregate(Sum('rating')) 

しかし、私はこれに基づいてレビューを注文しようとしていることから、私はReview.somethingで起動する必要はありません。私はまた、他の方法の周りにこれを行うことについて考え

order_byを使用しますか?

ありがとうございました。

答えて

0

、私は私の問題を解決する唯一の方法は、「余分な」方法を使用してカスタムSQLを記述することだったことが判明しましたクエリセットの

1

私は非常代わりに、一般的な外部キーのMulti-table inheritanceを使用することをお勧めします:いくつかの研究を行った後

class ReviewedItem(models.Model): 
    item_type = models.IntegerField() # exclude me on admin 
    def save(self): 
     self.item_type = self.ITEM_TYPE 
     super(ReviewedItem, self).save() 

class Entry(ReviewedItem): 
    ITEM_TYPE = 1 
    name = models.CharField(max_length=50) 

class Article(ReviewedItem): 
    ITEM_TYPE = 2 
    name = models.CharField(max_length=50) 

class Review(models.Model): 
    item = models.ForeignKey(ReviewedItem) 
    rating = models.IntegerField() 
    timestamp = models.DateTimeField(auto_now_add=True) 
+0

こんにちはあるUdi。私は少しこれについて考え、このセットアップが私の元の質問にどのように答えるかを見ない。私はまだ 'ReviewedItem.annotate(Sum(subset_of_reviews))。order_by( 'Review')'を実行する必要があると信じており、これは存在しないようです。私はこれに正しく行きますか? – mwlow

関連する問題