0

在我的一个观点中,我在提出过滤器时遇到了问题。我正在创建一个包含博客条目、新闻文章和评论的站点。条目和文章​​与评论具有一般关系,因为评论可以标记它们中的任何一个。我要做的是根据比某个日期更新的评论的评分总和对条目/文章进行排序。

以下是简化模型:

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)

因此,鉴于我需要找到一个总和,我尝试使用注释和聚合,但遇到了两个问题。第一个是显然通用关系和注释不能很好地协同工作:https ://code.djangoproject.com/ticket/10461 。第二个问题是我认为不可能只对部分评论求和(在这种情况下,使用 timestamp__gte=datetime.now())。我这样做是错误的吗?

我也想过反过来这样做:

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

但是由于我试图根据这个来订购评论,我不需要从 Review.something 开始,这样我就可以使用 order_by 了吗?

谢谢。

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

After doing some research, I found out that the only way to solve my problem was to write custom sql using the "extra" method of QuerySets.

于 2011-07-19T05:04:27.493 回答