给出以下模型:
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()
但是这不会影响正在执行的查询数量。
自从我做过一段时间以来,但是我很确定你需要预取关系和关系关系: