0

ビューの 1 つでフィルタを使用する際に問題が発生しています。ブログ エントリ、ニュース記事、およびレビューを含むサイトを作成しています。レビューはそれらのいずれかにタグを付けることができるため、エントリと記事はレビューと一般的な関係にあります。私がやろうとしているのは、特定の日付より新しいレビューの評価の合計に基づいてエントリ/記事を並べ替えることです。

単純化されたモデルは次のとおりです。

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 つの問題に遭遇しました。最初のものは、明らかに一般的なリレーションと注釈がうまく連携しないということです: https://code.djangoproject.com/ticket/10461。2 つ目の問題は、レビューの一部 (この場合は timestamp__gte=datetime.now()) のみを合計することはできないと思います。私はこれを間違った方法でやっていますか?

私はまた、これを逆に行うことも考えました:

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

しかし、これに基づいてレビューを並べ替えようとしているので、order_by を使用できるように Review.something から始める必要はありませんか?

ありがとう。

4

2 に答える 2

1

一般的な外部キーの代わりにマルチテーブル継承を使用することを強くお勧めします:

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)
于 2011-07-06T19:33:20.837 に答える
0

いくつかの調査を行った後、問題を解決する唯一の方法は、QuerySets の「追加」メソッドを使用してカスタム SQL を記述することであることがわかりました。

于 2011-07-19T05:04:27.493 に答える