【问题标题】:Django: Get all blogs and their latest blog entriesDjango:获取所有博客及其最新的博客条目
【发布时间】:2010-08-06 18:14:56
【问题描述】:

假设我有这两个模型:

class Blog(models.Model):
    name = models.CharField(max_length=64)
    # ...

class Entry(models.Model):
    blog = models.ForeignKey(Blog)
    added = models.DateTimeField(auto_now_add=True)
    # ...

现在我想获取所有博客的列表以及每个博客的最新博客条目。最好的方法是什么?

如果有什么不同,我们可以假设每个博客至少有一个条目。

【问题讨论】:

    标签: django django-models django-queryset


    【解决方案1】:

    有一个迂回(而且非常老套)的方式来做到这一点。如果您不介意去规范化,您可以将可选的 latest_entry 字段添加到您的 Blog 模型中。然后,您可以覆盖 Entry.save() 以在每次创建 Entry 实例时为相应的 Blog 实例更新此字段。或者,您可以添加一个信号来执行此操作。

    def save(self, *args, **kwargs):
        if not self.pk: #This object is being created, not updated.
            self.blog.latest_entry = self        
        models.Model.save(self, *args, **kwargs)
    

    是的,它不干净。但它会减少查询的数量。然后你可以这样做:

    [(blog, blog.latest_entry) for blog in Blog.objects.all()]
    

    【讨论】:

      【解决方案2】:

      可以使用相关管理器的 latest() 方法:

      blogs = Blog.objects.all()
      
      a_blog = blogs[0]
      latest_entry = a_blog.entry_set.latest()
      
      # or...
      latest_entries = [blog.entry_set.latest() for blog in blogs]
      

      类似的东西。

      【讨论】:

      • 这将是理想的方法,但不幸的是(除非我严重弄错了)这会产生比博客更多的查询(一个获取每个博客的最新条目的查询)。我在想也许有一些更聪明的方法,但我开始相信没有。
      • 四年后,我开始同意你的观点@DenizDogan
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多