POST pk в FormData() превращает его в строку, где я могу преобразовать его обратно в int?

В React я отправляю formData() в свой бэкэнд Django. Первоначально я просто отправлял int для поля pk, но затем я добавил поле изображения, поэтому мне пришлось преобразовать данные, которые я отправлял, в formData. Теперь я получаю сообщение об ошибке, что мой бэкэнд ожидал int, а не строку. FormData преобразует данные в строки.

Мой сериализатор выглядит так:

class TripReportSerializer(serializers.ModelSerializer):
    author = AuthorField(queryset=User.objects.all())
    countries = CountryField(queryset=Country.objects.all(), many=True)
    favoriters = serializers.PrimaryKeyRelatedField(required=False, queryset=User.objects.all(), many=True)
    image = serializers.ImageField(max_length=None, use_url=True, required=False)

    class Meta:
        model = TripReport
        fields = ('__all__')

Поле стран - это поле, которое доставляет мне неприятности. Я сериализовал это так:

class CountryField(serializers.PrimaryKeyRelatedField):

    def to_representation(self, value):
        pk = super(CountryField, self).to_representation(value)
        try:
            item = Country.objects.get(pk=pk)
            serializer = CountrySerializer(item)
            return serializer.data
        except Country.DoesNotExist:
            return None

    def get_choices(self, cutoff=None):
        queryset = self.get_queryset()
        if queryset is None:
            return {}

        return OrderedDict([(item.id, str(item)) for item in queryset])

что позволяет мне выполнять POST только с помощью pk (или списка pks) вместо всего объекта путем переопределения метода to_representation. Это возможно int(validated_data['pk'] где-то или мне нужно переопределить мой метод создания?

мой метод post в React выглядит следующим образом:

export const postTripReport = (author, title, content, countries, image) => {
  const token = localStorage.getItem('token');
  return dispatch => {
    dispatch(postTripReportsPending());
    const formData = new FormData();
    formData.append('title', title);
    formData.append('content', content);
    formData.append('author', author);
    formData.append('countries', countries);
    formData.append('image', image);
    axios.post(
      `${process.env.REACT_APP_API_URL}/api/v1/reports/`,formData,
      {headers: { 'Authorization': `Token ${token}`}}
    )
      .then(response => {
        dispatch(postTripReportsFulfilled(response.data));
      })
      .catch(err => {
        dispatch(postTripReportsRejected());
        dispatch({type: "ADD_ERROR", error: err});
      })
  }
}

0 ответов

Другие вопросы по тегам