【问题标题】:Django generic relation problemDjango泛型关系问题
【发布时间】:2011-09-29 20:15:45
【问题描述】:

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

以下是简化模型:

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 吗?

谢谢。

【问题讨论】:

    标签: django generics django-models relation


    【解决方案1】:

    经过一番研究,我发现解决我的问题的唯一方法是使用 QuerySets 的“额外”方法编写自定义 sql。

    【讨论】:

      【解决方案2】:

      我强烈建议使用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)
      

      【讨论】:

      • 你好,乌迪。我想了一会儿,没有看到这个设置如何回答我原来的问题。我相信我仍然需要做ReviewedItem.annotate(Sum(subset_of_reviews)).order_by('Review'),这似乎不存在。我这样做对吗?
      猜你喜欢
      • 2012-03-20
      • 2011-01-17
      • 1970-01-01
      • 2011-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多