首页 > 解决方案 > 如何在确保查询已优化的同时获取相关表中的最新条目

问题描述

我有两个模型在考虑中。RV_Offers 和 RV_Details。每个报价都可以有多个详细信息,即我在 RV_Details 表中有一个外键关系字段。

这是我的看法:

rv_offers_queryset = RV_Offers.objects.all().select_related('vendor').prefetch_related('details')
details_queryset = RV_Details.objects.all().select_related('rv_offer')

title = Subquery(details_queryset.filter(
                rv_offer=OuterRef("id"),
            ).order_by("-created_at").values("original_title")[:1])

offers_queryset = rv_offers_queryset.annotate(
                title=title).filter(django_query)
            offers = RVOffersSerializer(offers_queryset, many=True).data
            return Response({'result': offers}, status=HTTP_200_OK)

可以看出,我将 offer 查询集传递给序列化程序。现在,这是我的序列化程序:

class RVOffersSerializer(serializers.ModelSerializer):
    details = serializers.SerializerMethodField()
    vendor = VendorSerializer()

    def get_details(self, obj):
        queryset = RV_Details.objects.all().select_related('rv_offer')
        queryset = queryset.filter(rv_offer=obj.id).latest('created_at')
        return RVDetailsSerializer(queryset).data

    class Meta:
        model = RV_Offers
        fields = '__all__'

如果您查看 get_details 方法,我正在尝试获取属于报价的最新详细信息。我的问题是,即使我使用 select_related 来优化查询,结果仍然非常慢,事实上,我使用 django 调试工具栏来检查查询,显然 select_related 似乎没有效果。我做错了什么或者我还能如何解决这个问题?

标签: mysqldjangoquery-optimizationgreatest-n-per-groupdjango-serializer

解决方案


这就是我为减少数据库上的查询数量所做的事情:

def get_details(self, obj):
    details = obj.details.last()
    return RVDetailsSerializer(details).data

使用它,我能够将查询数量从 45 个减少到 4 个。这是因为在视图中,我已经使用了 select_related 来制作查询集,而这里又使用了 obj。


推荐阅读