【问题标题】:Django query taking too much timeDjango查询花费太多时间
【发布时间】:2017-09-24 23:02:22
【问题描述】:

我正在使用 django 和 django rest 框架对数据中的所有用户进行查询,这些用户具有作为 url 参数发送的权限,但此查询花费的时间太长。

我是用户 pycharm 调试器,我如何尝试检查为什么需要很长时间,这是函数:

@list_route(url_path='permission/(?P<permission>.+)')
def read_permission(self, request, *args, **kwargs):
    serializer = self.get_serializer_class()
    qs = get_user_model().objects.filter_by_permission(self.kwargs.get('permission'))
    qs = qs.order_by(Lower('username'))
    return Response(serializer(qs, many=True).data)

更新

添加序列化器

class UserSerializer(UserLabelMixin):
    user_permissions = serializers.SlugRelatedField(many=True, read_only=True, slug_field='codename')

    class Meta:
        model = get_user_model()
        fields = ['id', 'email', 'is_superuser', 'is_staff', 'label',
                  'full_name', 'first_name', 'last_name', 'username',
                  'teams', 'date_joined', 'last_login',
                  'user_permissions', 'groups', 'ui_preferences', 'internal_project',
                  'staff_id', 'oem_id', 'oem_email', 'oem_department', 'comment']
        read_only_fields = fields

【问题讨论】:

  • 这里有多长?有多少用户?
  • 您可以使用django debug panel (github.com/recamshak/django-debug-panel) 来检查每个查询的原始sql查询和时间
  • 您不会在该方法中看到太多,因为查询集是惰性的,并且在序列化程序中使用它们之前不会被评估...也许您应该尝试对查询集进行基准测试,看看它是否是 db需要时间或序列化的查询...还要检查您是否得到重复的 not (docs.djangoproject.com/en/1.11/ref/models/querysets/…)。
  • @AndreyShipilov ~15 秒。 55 个用户
  • 请显示您的序列化程序

标签: django django-rest-framework


【解决方案1】:

这可能对你有帮助

get_user_model().objects.prefetch_related("user_permissions", "groups").filter_by_permission...

【讨论】:

  • 预取在这里没有任何改进。
  • @AndreyShipilov , serializer(qs, many=True) 将降低性能。由于User 已经与group 建立了manytomant 关系。请看ses4j.github.io/2015/11/23/…
  • 这并没有改善任何东西。编写测试并阅读代码。
  • 如果序列化器有相关模型的嵌套序列化器,它将提高性能。
  • @Coding 检查更新答案。您还覆盖了用户模型吗?如果没有,请在 prefetch_related 中添加 manytomanyforienkey 字段
猜你喜欢
  • 1970-01-01
  • 2018-01-08
  • 2019-11-14
  • 2012-09-03
  • 2013-07-11
  • 1970-01-01
  • 1970-01-01
  • 2013-07-18
相关资源
最近更新 更多