我在其中一个视图中遇到过滤器时出现问题。我正在创建一个包含博客条目,新闻文章和评论的网站。条目和文章与评论具有通用关系,因为评论可以标记其中任何一个。我要做的是根据评论的总和对条目/文章进行排序比特定日期更新。
以下是简化模型:
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吗?
感谢。
答案 0 :(得分: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)
答案 1 :(得分:0)
经过一些研究,我发现解决我的问题的唯一方法是使用QuerySets的“额外”方法编写自定义sql。