Serializer raise exception to foreign data

I have complex selection logic for GET request, but serializer raise next exception.

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 has relationship One to One through models.ForeignKey(unique=True). Selection query create by use select_related('regulation') I added required serializers and models below.

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"),
                )
            ),
        ),
    )

Serializers

Crossroad

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__"

Regulation

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

Models

Regulation

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)

If I change Regulation serializer as below then crossroad serializer work successful - if there is regulation then serialized it else return empty object {}. However correct set null.

class CrossroadDirectionRegulationSerializer(serializers.ModelSerializer):
    class Meta:
        model = CrossroadDirectionRegulation
        exclude = ("crossroad_direction",)
Back to Top