【问题标题】:Django-rest-framework serializer makes a lot of queriesDjango-rest-framework 序列化器进行大量查询
【发布时间】:2013-07-04 09:16:37
【问题描述】:

假设我有这个模型:

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

我有这个 DRF 序列化程序,它返回 Places 的列表(调用它的视图使用 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 外键关系进行查询,总和最多查询。这当然会对性能产生很大影响。

另外值得一提的是,对于调用序列化程序的视图,我使用自定义查询仅返回与中心点有一定距离的get_queryset() Places。为此,我使用了 Django 的 extra() 方法。

我已尝试将select_relatedprefetch_related 与上述查询一起使用,但就序列化程序稍后进行的查询而言,它似乎没有任何区别。

我错过了什么?

【问题讨论】:

    标签: django django-models django-rest-framework


    【解决方案1】:

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

    如果您使用通用视图,请确保在视图的“查询集”属性中进行设置。

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

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

    【讨论】:

    • 感谢您的回复,汤姆。如果查询需要从请求中获取值,我可以使用“queryset”属性吗?出于这个原因,我现在使用get_queryset()
    • @TomChristie 嗨,你能帮我吗? stackoverflow.com/questions/26744664/…
    猜你喜欢
    • 2014-04-16
    • 2015-06-29
    • 2015-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-23
    • 2016-09-29
    相关资源
    最近更新 更多