Модель Django ForeignKey не работает с сериализатором

Я пытаюсь создать приложение django, которое принимает файл записи как загруженный файл, а затем генерирует данные для этого файла записи и сохраняет их в локальной директории на локальном ПК "сервера", поэтому на данный момент у меня есть следующее:

models.py:

class Sensor(models.Model):
    name = models.CharField(max_length=50)
    type = models.CharField(max_length=50)
    OwnerCompany = models.CharField(max_length=50)

    def __str__(self):
        return self.name
    

class Bag(models.Model):
    name = models.CharField(max_length=255)
    sensor = models.ForeignKey("Sensor",on_delete=models.CASCADE)
    date_created = models.DateTimeField(auto_now_add=True)
    bag_file = models.FileField(upload_to="bag_files/")

    def __str__(self) -> str:
        return self.name

views.py :

class BagView(APIView): #to be changed to viewset
    parser_classes = [MultiPartParser]

    def get(self, request):
        bags = Bag.objects.all()
        serializer = BagSerializer(bags, many=True)
        return Response(serializer.data)
    
    def post(self, request):
        print(request.FILES,request.data)
        serializer = BagSerializer(data=request.data)
        if serializer.is_valid():
            bag_upload = request.FILES['bag_upload']
            if bag_upload:
                bag_name = os.path.basename(bag_upload.name)
                serializer.create(serializer.validated_data,bag_name)
                return Response({'message': 'Bag File Created and Data Extracted', 'data': serializer.data}, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

serializers.py :

class SensorSerializer(serializers.ModelSerializer):

    class Meta:
        model = Sensor
        fields = "__all__"
    

class BagSerializer(serializers.ModelSerializer):
    bag_upload = serializers.FileField(write_only=True)

    class Meta:
        model = Bag
        fields = ['id', 'sensor', 'date_created', 'bag_upload']

    def create(self, validated_data,bag_name):
        print("HIIII")
        bag_upload = validated_data.pop('bag_upload', None)
        sensor_data = validated_data.pop('sensor', None)  # Get 'sensor' data from validated data
        print(sensor_data)
        bag_name = bag_name

        # Check if 'sensor' data is provided
        if sensor_data is None:
            raise serializers.ValidationError("Sensor data is required")

        sensor_instance,created = Sensor.objects.get_or_create(name=sensor_data.name)
        # Get or create the sensor instance
        # bag_instance = Bag.objects.create(name=bag_name, sensor=sensor_instance, **validated_data)
        with tempfile.NamedTemporaryFile(delete=False) as temp_file:
            for chunk in bag_upload.chunks():
                temp_file.write(chunk)
            temp_file_path = temp_file.name


        extracted_data = ExtractDataFrame(sensor_data.name,temp_file_path).to_csv(os.path.join(settings.SAVED_CSV_ROOT,f"{bag_name}.csv"),sep=';')
        bag_instance = Bag(name=bag_name, bag_file=extracted_data, **validated_data)
        bag_instance.sensor = sensor_instance
        bag_instance.save()
        return bag_instance

Итак, я пытаюсь сделать так: каждый раз, когда человек загружает файл reocrd, он должен упомянуть датчик, связанный с этим файлом записи во фронтенде, используя метод curl следующим образом:

curl -X POST http://127.0.0.1:8000/Bag/ \    -F "bag_upload=@30kph-medium.2024-03-01.15-39-16.11.bagtmp;filename=30kph-medium.2024-03-01.15-39-16.11.bagtmp" \    -F "sensor=1" \    -H "Content-Type: multipart/form-data"

эта команда здесь работает нормально и загружает файл, генерирует данные с помощью функции ExtractDataframe, но когда я пытаюсь передать экземпляр датчика в bag_instance, я получаю эту ошибку:

KeyError: "Получена ошибка KeyError при попытке получить значение для поля sensor на сериализаторе BagSerializer.\nПоле сериализатора может быть названо неверно и не соответствует какому-либо атрибуту или ключу в экземпляре OrderedDict экземпляра.\nОригинальный текст исключения был: 'sensor'."

я не знаю почему, хотя я убедился, что sensor_instance является экземпляром класса модели Sensor. это также происходит, когда я использую sensor = serializers.PrimaryKeyRelatedField(queryset=Sensor.objects.all(), source='sensor_id'). В сериализаторе Bag я просто не получаю ошибку, он ничего не говорит

Кто-нибудь может помочь мне с этим, пожалуйста, я был бы очень признателен за это

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