Пользовательский метод сериализатора Django Rest Framework для преобразования FormData () из строки в int - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть сериализатор, который я могу POST с объектами pk и ПОЛУЧИТЬ весь вложенный объект:

class CountryField(serializers.PrimaryKeyRelatedField):
    '''
    This serializer allows GET requests to return the full nested Country
    object, but use the pk for POST/PUT/PATCH requests. This serializer is used
    with the Trip Report and User Detail serializers to simplify handling
    requests from the frontend. This serializer is used on the User & Trip
    Report Views. This makes POST & PUT requests from the frontend easy to
    maintain, e.g. the pk can be stored as the value of an option on a select
    form, instead of having to store the entire country object.
    '''
    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])

Некоторые из моих данных поступают из моего интерфейса React как FormData () и поэтому вместо того, чтобы бытьсписок целых чисел, представляющих pk объектов, преобразуется в список строк.При публикации в Viewset, который использует этот сериализатор:

class TripReportViewSet(viewsets.ModelViewSet):
    permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
    serializer_class = TripReportSerializer
    pagination_class = TripReportSetPagination
    # To order by favorite count or 'top':
    queryset = TripReport.objects.all().annotate(count=Count('favoriters')).order_by('-count')
    #queryset = TripReport.objects.all().order_by('-pk')
    filter_backends = (filters.SearchFilter, filters.OrderingFilter)
    search_fields = ('=author__username', '=slug', 'countries__name', )
    ordering_fields = ('pk', )

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__')

Я получаю ошибку Неверный тип.Ожидаемое значение пк, получено ул.Где я могу написать метод для преобразования этого списка строк в список целых чисел?

Дополнительные сведения: мне нужно было преобразовать данные POST в FormData () только после того, как я добавил поле изображения в свою модель.Когда я первоначально отправил POST со списком pks, у меня не было проблем, но теперь, когда это FormData (), я получаю сообщение об ошибке.

...