Получена ошибка AttributeError при попытке получить значение для поля `transformerNamePlate` на сериализаторе `MainDataSerializer`.

я пытаюсь получить список основных объектов со всеми вложенными в них объектами. но я получаю эту ошибку

вот мои коды

views.py `

@api_view(['GET'])
def getSelectedDevice(request):
    try:

        device_id=request.GET.get('dID', None)
        device=Main.objects.filter(dID=device_id)
        print("device obg:\n",device)
        serializer=MainDataSerializer(device)
        return Response(serializer.data,many=True)
    except Main.DoesNotExist:
        return Response(status=404)

`

models.py

`



class TransformerNamePlate(models.Model):
    power=models.FloatField()
    uk=models.PositiveIntegerField()
    z0nom=models.FloatField()
    vectorGroup=models.CharField(max_length=10)
    vectorGroupLabel=models.CharField(max_length=10)
    uside1=models.FloatField()
    uside2=models.PositiveIntegerField()
    
    


class Main(models.Model):
    dID=models.CharField(max_length=10)
    tID=models.CharField(max_length=12)
    user=models.CharField(max_length=40)
    deviceAliasName=models.CharField(max_length=60)
    dateTime=models.DateTimeField()
    #did and Tid (search) -> charfield
    transformerNamePlate=models.OneToOneField(TransformerNamePlate,on_delete=models.PROTECT)
    transformerInfo=models.OneToOneField(TransformerInfo,on_delete=models.PROTECT)
    detcTapChanger=models.OneToOneField(DETCTapChanger,on_delete=models.PROTECT,null=True)
    temperatureCorrectionHV=models.OneToOneField(TemperatureCorrectionHV,on_delete=models.PROTECT)
    temperatureCorrectionLV=models.OneToOneField(TemperatureCorrectionLV,on_delete=models.PROTECT)
    uk=models.OneToOneField(UK,on_delete=models.PROTECT)
    turnRatioTolerance=models.OneToOneField(TurnRatioTolerance,on_delete=models.PROTECT)
    tests=models.ForeignKey(Test,null=True,on_delete=models.PROTECT)

` serializer.py

`



class TransformerNamePlateSerializer(serializers.ModelSerializer):
    class Meta:
        model=TransformerNamePlate
        fields="__all__"


class MainDataSerializer(serializers.ModelSerializer):
    transformerNamePlate=TransformerNamePlateSerializer(many=False,read_only=False)
    transformerInfo=TransformerInfoSerializer(many=False, read_only=False)
    detcTapChanger=DETCTapChangerSerializer(many=False, read_only=False)
    temperatureCorrectionHV=TemperatureCorrectionHVSerializer(many=False, read_only=False)
    temperatureCorrectionLV=TemperatureCorrectionLVSerializer(many=False, read_only=False)
    uk=UKSerializer(many=False, read_only=False)
    turnRatioTolerance=TurnRatioToleranceSerializer(many=False, read_only=False)
    
    #tests=Test ->(many=False, read_only=True) 
    
    class Meta:
        model=Main
        fields="__all__"
    def create(self, validated_data):
        
        transformerInfo_data=validated_data.pop('transformerInfo')
        temperatureCorrectionHV_data=validated_data.pop('temperatureCorrectionHV')
        temperatureCorrectionLV_data=validated_data.pop('temperatureCorrectionLV')
        transformerNamePlate=validated_data.pop('transformerNamePlate')
        uk_data=validated_data.pop('uk')
        turnRatioTolerance_data=validated_data.pop('turnRatioTolerance')
        detcTapChanger_data=validated_data.pop('detcTapChanger')

        #Remember to add other parts of test data
        test_data=validated_data.pop('tests')
        #print(validated_data)
        main_data=Main(**validated_data)
        # for data in temperatureCorrectionHV_data:
        #     print (data)
        TemperatureCorrectionHV.objects.create(main=main_data,**temperatureCorrectionHV_data)
        TemperatureCorrectionLV.objects.create(main=main_data,**temperatureCorrectionLV_data)
        DETCTapChanger.objects.create(main=main_data,**detcTapChanger_data)
        UK.objects.create(main=main_data,**uk_data)
        TransformerInfo.objects.create(main=main_data,**transformerInfo_data)
        TransformerNamePlate.objects.create(main=main_data,**transformerNamePlate)
        TurnRatioTolerance.objects.create(main=main_data,**turnRatioTolerance_data)
        #     Test.objects.create(main=main_data,**test_data)
        return main_data


    def save(self,data=None, **kwargs):
        if data!=None:
            main_data=self.create(validated_data=data)
            main_data.save()
            return
        else:
            return super().save(**kwargs)
  

`

Я понял, что это потому, что Main.objects.all() не возвращает эти вложенные данные, а возвращает только поле id, и из-за этого я получаю KeyError в сериализаторе, потому что он ищет фактический объект, а не его id.

я выяснил, что метод filter возвращает список Main Data, а мой сериализатор принимает только один

поэтому я передал many=True при вызове сериализатора:

serializer=MainDataSerializer(device)

To

serializer=MainDataSerializer(device,many=True)
Вернуться на верх