在Django rest框架中使用ModelSerializer的select_related queryset

Dil*_*ine 6 django-rest-framework

我正在尝试将"select_related"查询集方法与DRF序列化程序一起使用,但此示例仍在执行大量SQL查询.

如何从select_related方法获取相关对象"model_b"?

class Model_A(models.Model):
    title = models.CharField(max_length=100)
    description = models.TextField()
    model_b = models.ForeignKey(Model_B, null=True, blank=True)

class Model_B(models.Model):
    title = models.CharField(max_length=100)


class Model_A_Serializer(serializers.ModelSerializer):
    model_b = Model_B_Serializer(source="model_b")
    class Meta:
        model = Model_A
        fields = ('title', 'model_b')

class Model_B_Serializer(serializers.ModelSerializer):
    class Meta:
        model = Model_B


class Model_A_View(viewsets.ModelViewSet):
    serializer_class = Model_A_Serializer
    queryset = Model_A.objects.select_related('model_b').all()
Run Code Online (Sandbox Code Playgroud)

Ros*_*ers 6

prefetch_related代替使用。

queryset = Model_A.objects.all().prefetch_related('model_b')
Run Code Online (Sandbox Code Playgroud)

另外,您可以使用此答案将您的 sql 查询记录到控制台

  • `select_lated` 在您的情况下应该可以正常工作它们的行为略有不同:`select_lated` 将通过 join 将 model_b 包含在原始查询中,`prefetch_lated` 将使用 `WHERE ... IN ()` 对 model_b 运行单个单独的查询。 (8认同)