【问题标题】:Django prefetch_related on __str__() methodDjango prefetch_related 上 __str__() 方法
【发布时间】:2018-02-10 15:07:15
【问题描述】:

我的模型:

class B(models.Model):
    label = models.CharField()

class A(models.Model):
    b = models.OneToOneField(B, null=True, blank=True, on_delete=models.PROTECT)

    def __str__(self):
        return u'[{}] Event:'.format(self.b.label)

现在,使用 django 调试工具栏查看请求期间完成的查询,我注意到许多查询执行了 200 多次。我知道我会使用 prefetch_related 来解决,但是当在 str 方法中完成查找时,我必须把它放在哪里?

【问题讨论】:

  • 不!不要把它放在__str__。请发布您的视图代码,这很可能是所有这些查询发生的地方
  • 200+次是由可浏览API形式的选择引起的
  • 好吧,我不认为这是可定制的。只要您的最终用户看不到该页面,就可以了。你应该优化自己的观点

标签: django database django-rest-framework


【解决方案1】:

您的GenericViewModelViewSet 应该有一个queryset 属性来定义它应该在哪个集合上工作。

您需要在此处添加prefetch_related / select_related

class UserList(generics.ListCreateAPIView):
    queryset = User.objects.all().prefetch_related('groups')
    serializer_class = UserSerializer
    permission_classes = (IsAdminUser,)

【讨论】:

  • 需要 all() 吗?
猜你喜欢
  • 1970-01-01
  • 2015-04-18
  • 1970-01-01
  • 1970-01-01
  • 2017-04-24
  • 2012-10-07
  • 2021-11-04
  • 2019-03-30
  • 2013-11-23
相关资源
最近更新 更多