【发布时间】:2023-04-03 11:51:01
【问题描述】:
我有一个序列化Order 模型的 DRF ModelSerializer 类。这个序列化器有一个字段:
num_modelA = serializers.SerializerMethodField()
`
def get_num_modelA(self, o):
r = ModelA.objects.filter(modelB__modelC__order=o).count()
return r
ModelA 有一个ForeignKey 字段modelB,ModelB 有一个ForeignKey 字段modelC,ModelC 有一个ForeignKey 字段order。
问题显然在于,对于每个序列化的订单,它都会对数据库进行额外的查询,这会降低性能。
我已经实现了一个静态方法setup_eager_loading,如here 所述,它修复了我拥有的其他字段的 N+1 查询问题。
@staticmethod
def setup_eager_loading(queryset):
# select_related for "to-one" relationships
queryset = queryset.select_related('modelD','modelE')
return queryset
我的想法是我也可以使用prefetch_related 来减少查询次数。但我不确定如何执行此操作,因为 Order 和 ModelA 由多个外键分隔。让我知道是否有任何其他信息有用
【问题讨论】:
-
可以分享模型吗?尤其是
ForeignKeys 和related_name=s 很重要。
标签: django api serialization django-rest-framework