假设我有这两个模型:
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)
# ...
现在我想获得所有博客的列表以及每个博客的最新博客条目。最好的方法是什么?
如果它有任何区别,我们可以假设每个博客至少有一个条目。
答案 0 :(得分:0)
您可以使用相关经理的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]
类似的东西。
答案 1 :(得分:0)
有一种环形交叉(非常hackish)的方式来做到这一点。如果您不介意取消规范化,可以在latest_entry
模型中添加可选的Blog
字段。然后,每次创建Entry.save()
实例时,您都可以覆盖Blog
以更新相应Entry
实例的此字段。或者,您可以添加信号来执行此操作。
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()]