Django rest框架-嵌套相关字段的优化序列化

问题描述 投票:0回答:1

给出以下模型:

class Model_A:
    ...

class Model_B:
    ...

class Model_C:
    model_a = ForeignKey(Model_A, related_name='c_items')
    model_b = ForeignKey(Model_B)
    ...

以及以下模型序列化器的设置:

class Model_A_Serializer:
    class Model_C_Serializer:
        class Meta:
            model = Model_C
            fields = ( 'model_b', ... )

    c_items = Model_C_Serializer(many=True)

    class Meta:
        model = Model_A
        fields = ( 'c_items', ... )

和基本视图集:

class Model_A_Viewset:
    model = Model_A
    queryset = model.objects.all()
    serializer_class = Model_A_Serializer

    ...

当用户POST使用以下JSON有效负载创建Model_A实例和Model_C实例时:

{
    'c_items': [
        {
            'model_b': 1
        },
        {
            'model_b': 2
        },
        {
            'model_b': 3
        }
    ]
}

注意:上面已经存在ID为1、2和3的Model_B实例,但是在上面的示例中不存在Model_A和Model_C实例。

然后我注意到django在序列化传入数据时似乎执行了以下查询:

SELECT ... FROM Model_B WHERE id = 1;
SELECT ... FROM Model_B WHERE id = 2;
SELECT ... FROM Model_B WHERE id = 3;

对我来说,这似乎没有必要,因为单一个SELECT ... FROM Model_B WHERE id IN (1,2,3)就可以完成任务。

我该如何进行优化?

我试图像上面那样修改上面的视图集中的查询集:

queryset = model.objects.prefetch_related('c_items__model_b').all()

但是这不会影响正在执行的查询数量。

python django django-models django-rest-framework django-serializer
1个回答
0
投票

自从我做过一段时间以来,但是我很确定你需要预取关系和关系关系:

© www.soinside.com 2019 - 2024. All rights reserved.