Получена ошибка 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)