Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django:获取所有博客及其最新博客条目_Django_Django Models_Django Queryset - Fatal编程技术网

Django:获取所有博客及其最新博客条目

Django:获取所有博客及其最新博客条目,django,django-models,django-queryset,Django,Django Models,Django Queryset,假设我有两个模型: 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) # ... 现在,我想获得所有博客的列表,以及每个博客的最新博客条目。最好的方法是

假设我有两个模型:

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)
    # ...
现在,我想获得所有博客的列表,以及每个博客的最新博客条目。最好的方法是什么

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

您可以使用相关经理的最新()方法:

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]
类似于此。

您可以使用相关管理器的最新()方法:

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]
类似这样的事情。

有一种迂回的(非常刻薄的)方法可以做到这一点。如果您不介意反规范化,您可以在您的
博客
模型中添加一个可选的
latest\u条目
字段。然后,您可以覆盖
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()]
有一种迂回的(非常刻薄的)方法可以做到这一点。如果您不介意反规范化,您可以在您的
博客
模型中添加一个可选的
latest\u条目
字段。然后,您可以覆盖
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()]

这将是一个理想的方法,但不幸的是(除非我严重弄错了),这将产生比博客更多的查询(每个博客都有一个最新的条目)。我在想也许有更聪明的方法,但我开始相信没有。4年后,我开始同意你的观点@DenizDoganThat将是实现这一目标的理想方法,但不幸的是(除非我大错特错),这将产生比博客更多的查询(每个博客都有一个最新条目)。我在想也许有更聪明的方法,但我开始相信没有。4年后,我开始同意你的观点@DenizDogan