使用prefetch_related减少查询开销

时间:2014-04-27 15:48:22

标签: django django-orm

我有两个模特。

class Category(models.Model):
    title = models.CharField(max_length=60, unique=True)

    def __unicode__(self):
       return self.title

class Post(models.Model):
    title = models.CharField(max_length=60, unique=True)
    category = models.ForeignKey(Category)
    #code 

views.py

class PostList(ListView):
     model = Post
     def get_queryset(self):
         queryset = Post.objects.all().\
         select_related('category')

但是对于我的主页面,我还需要导航栏的所有类别。向get_queryset()添加类别的最佳方法是什么?

我尝试使用prefetch_related。

post = Post.objects.all().prefetch_related('category') 

但我不了解如何获取所有类别。

这是正确的解决方案吗?

class PostList(ListView):
     def get_queryset(self):
         p = Post.objects.all().\
         select_related('category') #like tag for each post
         p.categories = Category.objects.all() #all categories for navbar 
         return p

或者Django有自己的方法来完成这项任务吗?

1 个答案:

答案 0 :(得分:0)

我不明白这与select_related或prefetch_related有什么关系。这些都不会有助于获取与您的帖子无关的类别:正如其名称所暗示的那样,它们与获取相关项目有关,而不是与不相关的项目有关。

如果您需要所有类别,只需执行Category.objects.all()