Сериализатор поднимает исключение для посторонних данных
У меня сложная логика выбора для 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",)