"ответ": "strptime() аргумент 1 должен быть str, а не datetime.datetime" проблема с форматом django datetime

В Django я написал метод delete, в котором я получаю некоторые запросы данных из API delete. Запрашиваемые данные

[
    {
      "acerage": 1,
      "batch_health": null,
      "actual_produce": null,
      "actual_yield_per_acre": null,
      "batch_id": 2583,
      "batch_status": "running",
      "commodity_id": 6,
      "commodity_variety_id": 20,
      "current_gdd": null,
      "current_pdd": null,
      "expected_delivery_date": "2022-02-15T18:30:00.000Z",
      "expected_produce": null,
      "farm_id": "1806",
      "historic_gdd": null,
      "historic_pdd": null,
      "historical_yield_per_acre": null,
      "sop_adherence": null,
      "stage": "germination",
      "start_date": "2022-02-06T18:30:00.000Z"
    }
]

Я удаляю строку в моей БД на основе batch_id с помощью метода delete и метод delete выглядит как


    def destroy(self, request, *args, **kwargs):
        """
            This function is used to destroy batch object
        """
        try:
            instance = self.get_object()
            instance.batch_status = 'aborted'
            instance.save()
            solr_delta_import()
        except Exception as e:
            return Response({"response": str(e)}, status=status.HTTP_400_BAD_REQUEST)
        return Response({"response": "deleted successfully"}, status=status.HTTP_200_OK)

и строка удаляется, когда мы запускаем эту функцию

Моя проблема заключается в том, что запрашиваемые значения данных start_time и expected_delivery_date приходят в строковом формате но из-за некоторых вычислений в моем файле модели, я конвертирую эту строку в формат DateTime, который выглядит следующим образом

файл модели выглядит как

    def update_batch_median_health(self):
        if self.start_date and self.expected_delivery_date:
            if self.id:
                start_date = datetime.strptime(self.start_date, '%Y-%m-%dT%H:%M:%SZ')
                expected_delivery_date = datetime.strptime(self.expected_delivery_date, '%Y-%m-%dT%H:%M:%SZ')
            else:
                start_date = datetime.combine(self.start_date, datetime.min.time())
                expected_delivery_date = datetime.combine(self.expected_delivery_date, datetime.min.time())
            end_date = min([expected_delivery_date, datetime.today()]) - relativedelta(hours=5, minutes=30)
            hours_diff = int((((end_date - start_date).total_seconds()) / 3600 / 2))
            median_date = start_date + relativedelta(hours=hours_diff)
            
            try:
                median_crop_health = self.history.as_of(median_date).crop_health
            except:
                median_crop_health = self.batch_health
            return median_crop_health
        else:
            return None

    def update_batch_name(self):
        batch_name = "({}) {}".format(self.id, self.commodity_name)
        if self.start_date:
            if self.id:
                start_date = self.start_date.split("T")
                batch_name += " | {}".format(start_date[0])
            else:
                batch_name += " | {}".format(self.start_date.strftime('%Y-%m-%d'))
        return batch_name

Теперь формат начальной_даты и ожидаемой_даты_доставки - DateTime

start_date = 2022-02-06 18:30:00+00:00
expected_delivery_date = 2022-02-15 18:30:00+00:00

Теперь, когда экземпляр получает неправильный ответ из-за неправильного формата start_date и expected_delivery_date, функция delete не дает правильного ответа

Ошибка

"response": "strptime() argument 1 must be str, not datetime.datetime"
}

Bad Request: /api/v1/batch/2583/
[19/Feb/2022 08:01:49] "DELETE /api/v1/batch/2583/ HTTP/1.1" 400 71

Как можно снова преобразовать оба столбца в строку и сохранить request_date и запустить функцию delete?

strptime принимает строку и преобразует ее в объект datetime.datetime. Вы не должны были передавать ему datetime.datetime.

datetime.datetime.strptime("2021-02-19", "%Y-%m-%d")
datetime.datetime(2021, 2, 19, 0, 0)

Если вам нужно преобразовать datetime.datetime в строку, используйте strftime:

mytime = datetime.datetime(2022, 2, 19, 14, 23, 51)
mytime.strftime('%Y-%m-%dT%H:%M:%SZ')
'2022-02-19T14:23:51Z'
Вернуться на верх