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