Я использую конфигурацию этой модели.
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
. Есть ли какое-то решение этого? Я что-то не так делаю?