Django / DRF - Serialize Queryset, позволяющий избежать проблемы N + 1 с SerializerMethodField - PullRequest
0 голосов
/ 16 апреля 2020

Я использую конфигурацию этой модели.

class Project(models.Model):
    name = models.CharField(max_length=64)

class Platform(models.Model):
    project = models.ForeignKey(Project, on_delete=models.CASCADE, related_name="project_platforms")
    is_deleted = models.BooleanField(default=False)

Теперь я получаю свой набор запросов, используя этот код.

queryset = Project.objects.prefetch_related("project_platforms")

Я хочу сериализовать этот набор запросов, используя следующий сериализатор.

class ProjectSerializer(serializers.ModelSerializer):
    platforms = serializers.SerializerMethodField("_platforms")

    class Meta:
        model = Project
        fields = ["id", "name", "platforms"]

        def _platforms(self, obj: Project) -> list:
            platforms = PlatformSerializer(obj.project_platforms.filter(is_deleted=False), many=True).data
            return platforms

Теперь, хотя я и использовал prefetch_related, когда я вызываю сериализатор в моем наборе запросов, он все равно вызывает один запрос для каждого проекта при извлечении платформ для каждого проекта. Я не могу использовать platforms = PlatformSerializer(read_only=True, many=True), поскольку PlatformSerializer объявлено ниже ProjectSerializer. Есть ли какое-то решение этого? Я что-то не так делаю?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...