django 避免在“ListField”中使用“PrimaryKeyRelatedField”对序列化程序进行多次查询

vsdwdz23  于 2023-03-31  发布在  Go
关注(0)|答案(1)|浏览(100)

我有下面的序列化程序

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来获取每个模型的数据,但也许我遗漏了什么。

2ul0zpep

2ul0zpep1#

这是REST框架库的一个问题,你必须重写它的处理方式来正确解决这个问题。我在这里记录了我的发现:https://github.com/encode/django-rest-framework/discussions/8919
你可以做的最简单的事情是将查询集限制为主键:queryset=someModel.objects.only("pk")它不会消除n+1问题,但它会使查询更快,因为您不会查询不需要的字段。

相关问题