Я реализую менеджер стандартной обуви с архитектурой REST, используя Django + Django rest.
Я использую собственный Маршрутизатор, унаследованный от DefaultRouter, для обслуживания моих конечных точек.
В конечную точку /resources/id
я добавил еще один глагол POST
, который вызывается методом custom_create
.
Здесь вы можете увидеть этот custom_create
метод:
viewsets.py
class ShoeViewSet(viewsets.ModelViewSet):
queryset = Shoe.objects.all()
filter_class = ShoeFilter
def get_serializer_class(self):
if self.action == 'custom_create':
return StockPostSerializer
else:
return ShoeSerializer
def custom_create(self, request, *args, **kwargs):
data = {}
data['shoe'] = kwargs['pk']
data['size'] = request.data.get('size')
data['amount'] = request.data.get('amount')
serializer = self.get_serializer(data=data)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
Мне нужно было сделать это, потому что у меня есть две модели, ниже вы можете увидеть мои 3 сериализатора:
serializers.py
class StockSerializer(serializers.ModelSerializer):
class Meta:
model = Stock
fields = ['size', 'amount']
class ShoeSerializer(serializers.ModelSerializer):
stock = StockSerializer(many=True, read_only=True)
class Meta:
model = Shoe
fields = ['description', 'provider', 'type', 'cost_price','sale_price','total_amount', 'stock']
class StockPostSerializer(serializers.ModelSerializer):
class Meta:
model = Stock
fields = ['shoe','size', 'amount']
Метод retrieve
(GET
глагол) этой конечной точки ожидает сериализации данных с помощью ShoeSerializer
, но метод custom_create
вставляет данные с использованием StockPostSerializer
. Как я могу вернуть ответ с другими данными, которые были вставлены?
Когда я пытаюсь вставить с этой конечной точкой, я получаю это сообщение об ошибке, но когда я обновляю страницу, я понимаю, что контент был вставлен (Если я использую почтальон вместо интерфейса de DRF, я не получаю никакого сообщение об ошибке, работает нормально).
Как мой метод custom_create
может правильно реагировать?
Вы можете проверить мой github , имена будут немного отличаться, потому что я перевел это здесь, чтобы вам было легче понять.
PS : Как вы, наверное, заметили, я не являюсь носителем английского языка, поэтому мне очень трудно выразить себя здесь, но я стараюсь изо всех сил и учусь все больше и больше. Если мой вопрос содержит ошибки грамматики / соответствия, пожалуйста, исправьте их, но вам не нужно отказывать мне, поэтому я пытаюсь учиться!