Учитывая отношения моделей, вложенные в 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. Если есть более простые или лучшие способы сделать это, я открыт для идей.