Django - POST/GET для HyperlinkedIdentityField
Я пытался следовать нескольким руководствам
https://stackabuse.com/creating-a-rest-api-with-django-rest-framework/
https://www.django-rest-framework.org/tutorial/2-requests-and-responses/
Оба не подошли, потому что мой код использует HyperlinkedIdentityField
Как мне добавить к нему POST/GET запрос?
views.py
class SpecialityView(APIView):
def get(self, request, id=None):
if id:
item = Speciality.objects.get(id=id)
serializer_class = SpecialitySerializer(item)
return Response({"status": "success", "data": serializer_class.data}, status=status.HTTP_200_OK)
items = Speciality.objects.all()
serializer_class = SpecialitySerializer(items, many=True)
return Response({"status": "success", "data": serializer_class.data}, status=status.HTTP_200_OK)
def post(self, request):
serializer_class = SpecialitySerializer(data=request.data)
if serializer_class.is_valid():
serializer_class.save()
return Response({"status": "success", "data": serializer_class.data}, status=status.HTTP_200_OK)
else:
return Response({"status": "error", "data": serializer_class.errors}, status=status.HTTP_400_BAD_REQUEST)
class WorkerView(APIView):
def get(self, request, id=None):
if id:
item = Worker.objects.get(id=id)
serializer_class = WorkerSerializer(item)
return Response({"status": "success", "data": serializer_class.data}, status=status.HTTP_200_OK)
items = Worker.objects.all()
serializer_class = WorkerSerializer(items, many=True)
return Response({"status": "success", "data": serializer_class.data}, status=status.HTTP_200_OK)
def post(self, request):
serializer_class = WorkerSerializer(data=request.data)
if serializer_class.is_valid():
serializer_class.save()
return Response({"status": "success", "data": serializer_class.data}, status=status.HTTP_200_OK)
else:
return Response({"status": "error", "data": serializer_class.errors}, status=status.HTTP_400_BAD_REQUEST)
serializers.py
class SpecialitySerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Speciality
fields = ['id', 'url', 'name']
class WorkerSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Worker
fields = ['id', 'url', 'name', 'last_name', 'hire_date', 'email', 'phone_number', 'job', 'speciality', 'salary',
'commission_pct', 'manager_id', 'department_id']
Страница ошибки :
AssertionError at /speciality/
`HyperlinkedIdentityField` requires the request in the serializer context. Add `context={'request': request}` when instantiating the serializer.
Говорит об ошибке! Используйте это при вызове сериализатора в представлении:
WorkerSerializer(item, context={'request': request})
Зачем это нужно? Вам нужно request
создать объект для сериализатора, поскольку некоторые поля нуждаются в нем для обработки.