【发布时间】:2015-10-10 13:03:18
【问题描述】:
- 我有一个带有 16 个 DecimalFields 的 Django 模型。
- 我创建了一个 ListAPIView 来获取这个数据。
- 有大约 5000 个此模型的实例 在我的数据库中,对此 api 视图的 GET 请求超过 15 秒。
型号:
class MyModel(models.Model):
f1 = models.DecimalField (max_digits=8, decimal_places=3)
f2 = models.DecimalField (max_digits=8, decimal_places=3)
f3 = models.DecimalField (max_digits=8, decimal_places=3)
f4 = models.DecimalField (max_digits=8, decimal_places=3)
f5 = models.DecimalField (max_digits=8, decimal_places=3)
f6 = models.DecimalField (max_digits=8, decimal_places=3)
f7 = models.DecimalField (max_digits=8, decimal_places=3)
f8 = models.DecimalField (max_digits=8, decimal_places=3)
f9 = models.DecimalField (max_digits=8, decimal_places=3)
f10 = models.DecimalField (max_digits=8, decimal_places=3)
f11 = models.DecimalField (max_digits=8, decimal_places=3)
f12 = models.DecimalField (max_digits=8, decimal_places=3)
f13 = models.DecimalField (max_digits=8, decimal_places=3)
f14 = models.DecimalField (max_digits=8, decimal_places=3)
f15 = models.DecimalField (max_digits=8, decimal_places=3)
f16 = models.DecimalField (max_digits=8, decimal_places=3)
序列化器:
class MyModelSerializer(serializers.ModelSerializer):
class Meta:
model = MyModel
我没有对数据进行任何过滤。当我在 django shell 中运行查询时,它会在几毫秒内运行。我认为序列化是这里的问题。但是,我使用的是默认的 ModelSerializer。
所有这些字段都在同一个表中,所以我看不出这里怎么会有 N+1 问题。
我可以做些什么来进一步分析这个问题?对于这么多模型实例,我是否应该期望我的查询会这么慢?
【问题讨论】:
-
你想把所有的 5000 个值带到客户端吗?如果不分页并仅序列化所需的项目。
-
我们现在只能盲目猜测。给我们一些眼睛,给我们模型和序列化器。
-
@ArunGhosh 我确实想将所有 5000 个值带到客户端。由于这些数据只有 1mb 左右,似乎应该有一种方法可以在 15 秒内从数据库到达客户端。
-
@KevinBrown 真的吗?我认为我对模型和序列化程序的描述足够直截了当,但我已经更新了问题。
-
@rawbeans 那是……令人担忧的。通常非查询问题是因为自定义模型和序列化程序对数据进行额外处理。但是,如果您的序列化程序和模型是裸露的(如您的示例所示),您将需要拿出一个实际的 Python 分析器。
标签: django serialization query-optimization django-rest-framework django-queryset