Django-rest-framework 序列化程序进行大量查询

标签 django django-models django-rest-framework

假设我有这个模型:

class Place(models.Model):
    ....
    owner = ForeignKey(CustomUserModel)
    ....

我有这个返回 Place 列表的 DRF 序列化程序(调用它的 View 使用 DRF 的 generics.ListAPIView 类):

class PlaceSerializer(serializers.ModelSerializer):
    owner = UserModelSerializer() # Gets only specific fields for a place owner

    class Meta:
        model = Place

问题是,当序列化器得到一个返回的查询时,比方说... 50 个地方,我可以看到(在 connection.queries 中)正在为每个 owner 外键关系,总结了很多查询。这当然对性能有很大的影响。

同样重要的是,对于调用序列化程序的 View ,我使用 get_queryset() 仅返回距离中心点一定距离的 Place自定义查询。为此,我使用了 Django 的 extra() 方法。

我已经尝试将 select_relatedprefetch_related 与上述查询一起使用,但对于稍后由序列化器。

我错过了什么?

最佳答案

select_related将按预期与序列化程序一起工作。

如果您使用的是通用 View ,请确保在 View 的“queryset”属性中进行设置。

在“get_queryset”中使用 select_related 也可以。

否则,我唯一可以建议的就是尝试通过更多调试来缩小问题范围。如果您仍然认为存在问题并且有一个最小的示例可以复制它,那么请将问题作为票证提出,或者将讨论带到邮件列表。

关于Django-rest-framework 序列化程序进行大量查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17502939/

相关文章:

django - 更改 django 模型 related_name 属性是否需要向南迁移?

python - Django:allow_tags和short_description如何工作?

python - 如何在 Django 中按文件名过滤图像字段

python - 如何在 Django REST Serializer 中标准化电子邮件字段值?

Python Django 从 DateField 按月获取不同的查询集

DjangoRestFramework - 将 "required = false"添加到 ModelSerializer 字段的正确方法?

python - 日期时间选择器 : how to set the min/max date based on SQL database

django - 用户未传递到模板 TEMPLATE_CONTEXT_PROCESSORS

Django Rest Framework 序列化程序返回应在更新时过滤掉的嵌套记录

python : Django TypeError: object() takes no parameters