我们想为django项目提供一个api,因此我们使用drf(django rest框架)。
我们使用ModelSerializer,它提供了一个快捷方式,可让您自动创建带有与Model字段相对应的字段的Serializer类。
我们的问题是运行非常缓慢。换句话说,序列化过程大约需要40秒才能检索到响应。
我们如何减少这种延迟?
View
class MyObjViewSet(viewsets.ModelViewSet):
pagination_class = LargeResultsSetPagination
def get_queryset(self):
queryset = MyObj.objects.all().order_by('time')
return queryset
serializer_class = MyObjSerializer
我的对象模型
class MyObj(models.Model):
id = models.BigIntegerField(primary_key=True)
time = models.DateTimeField()
type = models.CharField(max_length=5)
user = models.ForeignKey('User', related_name='myobj')
MyObj用户模型
class User(models.Model):
id = models.IntegerField(primary_key=True)
username = models.CharField(max_length=80)
我的Obj序列化器
class MyObjSerializer(serializers.ModelSerializer):
class Meta:
model = MyObj
fields = ('id', 'type', 'time', 'user')
我的问题是,当我想检索我的objs列表时,大约需要40秒!
最佳答案
这不是序列化程序的问题,而是查询中的问题。
您正在获取所有对象,由于分页,我想有很多对象,并且您希望它们按时间排序。问题在于模型定义没有提示数据库在时间字段上创建索引。
尝试添加提示以在数据库中创建索引,速度将会提高。
class MyObj(models.Model):
id = models.BigIntegerField(primary_key=True)
time = models.DateTimeField(db_index=True)
type = models.CharField(max_length=5)
user = models.ForeignKey('User', related_name='myobj')