Я разрабатываю простое веб-приложение, использующее openweathermap API. Существует вызов API для представления, которое возвращает данные API и отображает временную температуру и описание погоды для конкретного города, который вводит пользователь.
Приведенный ниже вызов API — это еще один вызов новой функции, которая позволяет пользователю сохранять определенные данные о погоде по своему выбору. Он берет temp и desc из состояния и отправляет их в бэкэнд-представление. Затем представление сохраняет эти данные в базе данных и возвращает ответ, который затем я буду использовать для отображения данных в том же вызове API. У меня выдает ошибку 400. Я зарегистрировал в консоли temp и desc, и они оба распечатываются правильно, поэтому я не отправляю неопределенные данные в серверную часть. Может быть, я сериализую данные?
Вызов интерфейса API
const saveWeather = (temperature, description) => {
const requestOptions = {
method: "POST",
headers: { "Content-Type": "application/json"},
body: JSON.stringify({
temperature: temperature,
description: description
})
};
fetch("/api/savedweather", requestOptions)
.then((response) => {
if (response.ok) {
console.info("OK");
}
})
.catch((error) => {
console.info(error);
});
}
Вид
class SaveWeather(APIView):
serializer_class = WeatherSerializer
def post(self, request, format=None):
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
temperature = serializer.data.get('temperature')
description = serializer.data.get('description')
weather = Weather(temperature=temperature, description=description)
weather.save()
return Response(WeatherSerializer(weather).data, status=status.HTTP_201_CREATED)
return Response({'Bad Request': "Invalid Data..."}, status=status.HTTP_400_BAD_REQUEST)
Модель
from django.db import models
class Weather(models.Model):
temperature = models.IntegerField(null=False, default=1)
description = models.CharField(max_length=50)
Класс сериализатора
from .models import Weather
from rest_framework import serializers
class WeatherSerializer(serializers.ModelSerializer):
class Meta:
model = Weather
fields = ('temperature', 'description')
Трудно сказать, не зная определений модели и сериализатора.
но поскольку это явно ошибка проверки сериализатора, вы можете проверить ошибки, выдаваемые сериализаторами, с помощью поля serializer.errors
.
if serializer.is_valid():
...
return Response(WeatherSerializer(weather).data, status=status.HTTP_201_CREATED)
print(serializer.errors)
Как говорится, температура не является целым числом, проверьте request.data
, если temperature
целое число.
Это сработало! Спасибо за отзыв, я только что изменил температуру на DecimalField.
Спасибо за ответ. Я только что добавил свой класс модели и сериализатора выше. Я также использовал ошибки сериализатора, и это дало мне это
{'temperature': [ErrorDetail(string='A valid integer is required.', code='invalid')]}