我正在使用Django REST框架编写API,昨天我想测试一下它在处理大数据时的工作方式。我找到了Tom Christie撰写的这篇教程,学会了如何对请求进行性能分析,发现对于10000个用户,我的请求需要2分20秒才能完成。
大部分时间都花费在对象序列化上(约65%),因此我想知道该怎么做才能加快速度呢?
我的用户模型实际上是扩展了默认的Django模型,所以使用.values()不能解决问题,因为我没有获取嵌套模型(即使它快得多)。
非常感谢任何帮助 :)
编辑
当检索查询集时, 我已经使用了.select_related()并且已经改善了我的时间,但只有几秒钟而已。总查询次数为10次,所以我的问题不在于数据库访问。
此外,我正在使用.defer(),以避免在此请求中不需要的字段。这也提供了一些改进,但还不够。
编辑#2
模型
from django.contrib.auth.models import User
from django.db.models import OneToOneField
from django.db.models import ForeignKey
from userena.models import UserenaLanguageBaseProfile
from django_extensions.db.fields import CreationDateTimeField
from django_extensions.db.fields import ModificationDateTimeField
from mycompany.models import MyCompany
class UserProfile(UserenaLanguageBaseProfile):
user = OneToOneField(User, related_name='user_profile')
company = ForeignKey(MyCompany)
created = CreationDateTimeField(_('created'))
modified = ModificationDateTimeField(_('modified'))
序列化器
from django.contrib.auth.models import User
from rest_framework import serializers
from accounts.models import UserProfile
class UserSerializer(serializers.ModelSerializer):
last_login = serializers.ReadOnlyField()
date_joined = serializers.ReadOnlyField()
is_active = serializers.ReadOnlyField()
class Meta:
model = User
fields = (
'id',
'last_login',
'username',
'first_name',
'last_name',
'email',
'is_active',
'date_joined',
)
class UserProfileSerializer(serializers.ModelSerializer):
user = UserSerializer()
class Meta:
model = UserProfile
fields = (
'id',
'user',
'mugshot',
'language',
)
视图
class UserProfileList(generics.GenericAPIView,
mixins.ListModelMixin,
mixins.CreateModelMixin):
serializer_class = UserProfileSerializer
permission_classes = (UserPermissions, )
def get_queryset(self):
company = self.request.user.user_profile.company
return UserProfile.objects.select_related().filter(company=company)
@etag(etag_func=UserListKeyConstructor())
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
SerializerMethodField
或处理数据的属性),也可能是非常糟糕的(如果你只是从数据库中提取东西)。 - Kevin Brown-Silva