Сериализатор поднимает исключение для посторонних данных

У меня сложная логика выбора для GET-запроса, но сериализатор поднимает следующее исключение.

Got AttributeError when attempting to get a value for field crossroad_direction on serializer CrossroadDirectionRegulationSerializer. The serializer field might be named incorrectly and not match any attribute or key on the RelatedManager instance. Original exception text was: 'RelatedManager' object has no attribute 'crossroad_direction'.

Direction имеет отношение One to One через models.ForeignKey(unique=True). Запрос на выборку создается с помощью select_related('regulation'). Ниже я добавил необходимые сериализаторы и модели.

QuerySet

crossroad_query: QuerySet = Crossroad.objects.prefetch_related(
        models.Prefetch(
            "time_loads",
            queryset=CrossroadTimeLoad.objects.filter(
                date_time__range=(from_dt, to_dt),
            ).order_by("date_time"),
        ),
        models.Prefetch(
            "sides",
            queryset=CrossroadSide.objects.prefetch_related(
                models.Prefetch(
                    "points",
                    queryset=CrossroadPoint.objects.prefetch_related(
                        models.Prefetch(
                            "time_params",
                            queryset=CrossroadPointTimeParams.objects.filter(
                                date_time__range=(from_dt, to_dt),
                            ).order_by("date_time"),
                        )
                    ),
                )
            ).order_by("name"),
        ),
        models.Prefetch(
            "directions",
            queryset=CrossroadDirection.objects.select_related(
                "regulation",
            ).prefetch_related(
                models.Prefetch(
                    "time_params",
                    queryset=CrossroadDirectionTimeParams.objects.filter(
                        date_time__range=(from_dt, to_dt),
                    ).order_by("date_time"),
                )
            ),
        ),
    )

Сериализаторы

Перекресток

class ReadonlyCrossroadFullDataSerializer(serializers.ModelSerializer):
    time_loads = CrossroadTimeLoadSerializer(many=True)
    sides = CrossroadSideFullDataSerializer(many=True)
    directions = CrossroadDirectionFullDataSerializer(many=True)

    class Meta:
        model = Crossroad
        fields = "__all__"

CrossrodDirection

class CrossroadDirectionFullDataSerializer(serializers.ModelSerializer):
    time_params = CrossroadDirectionTimeParamsSerializer(many=True)
    regulation = CrossroadDirectionRegulationSerializer(allow_null=True, default=None)

    class Meta:
        model = CrossroadDirection
        fields = "__all__"

Регулирование

class CrossroadDirectionRegulationSerializer(serializers.ModelSerializer):
    class Meta:
        model = CrossroadDirectionRegulation
        fields = "__all__"

Модели

Регулирование

class CrossroadDirectionRegulation(models.Model):
    crossroad_direction = models.ForeignKey(
        CrossroadDirection,
        on_delete=models.CASCADE,
        unique=True,
        related_name="regulation",
    )

    cycle_duration = models.IntegerField(default=180)
    green_signal_phase = models.IntegerField(default=60)

Если я изменю сериализатор регламента следующим образом, то сериализатор Crossroad будет работать успешно - если есть регламент, то он сериализуется, иначе возвращается пустой объект {}. Однако корректно устанавливается null.

class CrossroadDirectionRegulationSerializer(serializers.ModelSerializer):
    class Meta:
        model = CrossroadDirectionRegulation
        exclude = ("crossroad_direction",)
Вернуться на верх