У меня есть сериализатор, который я могу 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 (), я получаю сообщение об ошибке.