mysql - 如何在确保查询已优化的同时获取相关表中的最新条目
问题描述
我有两个模型在考虑中。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 似乎没有效果。我做错了什么或者我还能如何解决这个问题?
解决方案
这就是我为减少数据库上的查询数量所做的事情:
def get_details(self, obj):
details = obj.details.last()
return RVDetailsSerializer(details).data
使用它,我能够将查询数量从 45 个减少到 4 个。这是因为在视图中,我已经使用了 select_related 来制作查询集,而这里又使用了 obj。
推荐阅读
- python - AttributeError:“str”对象没有属性“_sa_instance_state”
- python - Python Global Not Behaving As Expected
- python - Web 应用程序中的 Gremlin Python
- r - 计算字符串列中关键字列表的出现总数
- python - 如何在应用程序的 urls.py 中设置路径以显示 localhost:8000/xxx(使用 django2.1.8)
- c# - 如何使循环每秒迭代 60 次?
- c++ - 如何在类向量中存储/使用外部函数指针
- java - 使用不记名令牌的改造请求
- javascript - 使用 Value from Option 从 JSON 中获取数据
- vue.js - vue-loader 15、webpack 4、vue-datepicker-local 错误运行:npm run dev