我有下面的序列化程序
class SomeSerializer(serializers.Serializer):
fields = serializers.ListField(
allow_empty=False,
child=serializers.PrimaryKeyRelatedField(queryset=someModel.objects.all())
)
当我在view/code上运行以下代码时:
serializer = SomeSerializer(data={'fields': [1, 2, 3, 4]})
serializer.is_valid()
对数据库运行4个不同的查询,每个someModel
对应一个get(id)
。有没有办法让序列化器只执行一个查询?,这样序列化器就可以使用如下内容:
queryset.filter(pk__in=[1, 2, 3, 4])
而不是:
queryset.get(1)
queryset.get(2)
queryset.get(3)
queryset.get(4)
我试着去挖掘django-rest-framework的源代码,看起来它只执行get
来获取每个模型的数据,但也许我遗漏了什么。
1条答案
按热度按时间2ul0zpep1#
这是REST框架库的一个问题,你必须重写它的处理方式来正确解决这个问题。我在这里记录了我的发现:https://github.com/encode/django-rest-framework/discussions/8919
你可以做的最简单的事情是将查询集限制为主键:
queryset=someModel.objects.only("pk")
它不会消除n+1问题,但它会使查询更快,因为您不会查询不需要的字段。