Учитывая отношения моделей, вложенные в 3 слоя, какой запрос вернет объект, который я смогу передать сериализаторам моделей Django Rest Framework

Учитывая, что модели связаны на три уровня вглубь, как я могу построить запрос, в котором я могу передать ответ сериализатору моделей Django Rest Framework? Код ниже с одним уровнем отношений работает.

Модлы

class SubArea(models.Model):
    label = models.CharField(max_length=20)
    fiber_switch = models.ForeignKey(
        'FiberSwitch', related_name='sub_areas')

class BackboneLine(models.Model):
    sub_area = models.ForeignKey(
        SubArea, related_name='backbone_lines')
    source = models.ForeignKey(
        Enclosure, related_name='backbone_lines_out')
    destination = models.OneToOneField(
        Enclosure, related_name='backbone_line_in')

    @property
    def label(self):
        return f'{self.source.box_number} - {self.destination.box_number}'

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

class BackboneLineSerializer(ModelSerializer):
    class Meta:
        model = BackboneLine
        fields = ['label']

class SubAreaSerializer(ModelSerializer):
    backbone_lines = BackboneLineSerializer(many=True)

    class Meta:
        model = SubArea
        fields = ['label', 'backbone_lines']

Код

sub_area = SubArea.objects.get(pk1)
sub_area_serialzer = SubAreaSerializer(sub_area)

Но если я добавляю модель BackboneLineSegments вместе с сериализатором для нее и изменяю BackboneLineSerializer для ее обработки, я получаю ошибки.

Добавлена модель

class BackboneLineSegment(models.Model):
    location = models.LineStringField()
    buried = models.BooleanField(default=False)
    backbone_line = models.ForeignKey(
        BackboneLine, related_name='segments'
    )

Новый сериализатор

class BackboneLineSegmentSerializer(GeoFeatureModelSerializer):

    class Meta:
        model = BackboneLineSegment
        geo_field = 'location'
        fields = ['location', 'buried']

Обновленный BackboneLineSerializer

class BackboneLineSerializer(ModelSerializer):
    segments = BackboneLineSegmentSerializer(many=True)

    class Meta:
        model = BackboneLine
        fields = ['label', 'segments']

Код

sub_area = SubArea.objects.get(pk1)
sub_area_serialzer = SubAreaSerializer(sub_area)

Выдается следующая ошибка.

Получена ошибка AttributeError при попытке получить значение для поля segments на сериализаторе BackboneLineSerializer. Поле сериализатора может быть названо неправильно и не совпадать ни с одним атрибутом или ключом экземпляра RelatedManager. Оригинальный текст исключения был следующим: объект 'RelatedManager' не имеет атрибута 'segments'.

Редактировать

Я использую сериализатор для генерации правильно отформатированного geoJson. Если есть более простые или лучшие способы сделать это, я открыт для идей.

Вернуться на верх