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