Django DRF - Как обновить поля объекта с помощью api_view?
В моем Django-приложении я управляю S3-бэкендами для импорта данных из них. Теперь я хотел бы иметь возможность обновлять определенные поля S3-бэкенда, но я не уверен, как это сделать:
Это моя текущая ситуация
views.py
@api_view(['PATCH'])
@authentication_classes([JSONWebTokenAuthentication])
@permission_classes([IsAuthenticated, IsAdminUser])
def s3_backend_update(request, pk):
"""
Updates a given S3Backend resources
"""
if request.method == 'PATCH':
obj = S3Backend.objects.filter(id=pk)
s3_storage_update_serializer = S3StorageUpdateSerializer(obj, data=request.data)
try:
if s3_storage_update_serializer.is_valid(raise_exception=True):
s3_storage_update_serializer.save()
s3_storage_serializer = S3StorageSerializer(instance=s3_storage_update_serializer.instance)
return JsonResponse(
{"status_code": S3Updated.status_code,
"default_detail": S3Updated.default_detail,
"default_code": S3Updated.default_code,
"updated_s3_backend": s3_storage_serializer.data,
}, status=status.HTTP_202_ACCEPTED, safe=False)
except APIException:
return Response(
{"status_code": S3UpdateFailure.status_code,
"default_detail": S3UpdateFailure.default_detail,
"default_code": S3UpdateFailure.default_code,
"error": s3_storage_update_serializer.errors
},
status=status.HTTP_406_NOT_ACCEPTABLE
)
serializers.py
class S3StorageUpdateSerializer(serializers.ModelSerializer):
id = serializers.PrimaryKeyRelatedField(queryset=S3Backend.objects.all())
class Meta:
model = S3Backend
fields = ('id', 'resource_name', 'access_key', 'secret_key', 'bucket', 'endpoint', 'region', 'library')
extra_kwargs = {'secret_key': {'write_only': True}} # We dont want to show the secret_key
def validate(self, data):
try:
s3_get_resource(endpoint=data['endpoint'],
access_key=data['access_key'],
secret_key=data['secret_key'],
region=data['region']).meta.client.head_bucket(Bucket=data['bucket'])
except (APIException, ClientError, EndpointConnectionError, NewConnectionError, ConnectionRefusedError) as e:
raise ValidationError('S3 Bucket does not exist or you dont have access privileges.', e)
return data
Мне кажется, что DRF не может обработать следующую строку:
S3StorageUpdateSerializer(obj, data=request.data)
Ошибка, которую я получаю в ответ, следующая:
AttributeError: объект 'QuerySet' не имеет атрибута 'pk'
Я новичок в API, поэтому я предполагаю, что я просто делаю что-то очень базовое неправильно.
Заранее спасибо.