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