【发布时间】: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