У меня есть два отдельных метода:
- для загрузки и проверки файла CSV FileUploadView (APIView) [PUT]
- для добавления новых объектов в базу данных на основе их загруженного файла data CsvToDatabase [POST]
загрузка файла
class FileUploadView(APIView):
parser_classes = (MultiPartParser, FormParser)
permission_classes = (permissions.AllowAny,)
def put(self, request, format=None):
if 'file' not in request.data:
raise ParseError("Empty content")
f = request.data['file']
filename = f.name
if filename.endswith('.csv'):
file = default_storage.save(filename, f)
r = csv_file_parser(file)
status = 204
else:
status = 406
r = "File format error"
return Response(r, status=status)
создание экземпляров
class CsvToDatabase(APIView):
def post(self, request, format=None):
r_data = request.data
...
#some logic
...
serializer = VendorsCsvSerializer(data=data)
try:
serializer.is_valid(raise_exception=True)
serializer.save()
except ValidationError:
return Response({"errors": (serializer.errors,)},
status=status.HTTP_400_BAD_REQUEST)
else:
return Response(request.data, status=status.HTTP_200_OK)
urls.py
urlpatterns = [
path('csv_upload/', FileUploadView.as_view(), name='csv_upload'),
path('from_csv_create/', CsvToDatabase.as_view(), name='csv_vendor_create'),]
В данный момент я просто передаю почтальону вручную результат PUT
метода FileUploadView
класса (Response(r, status=status
), получающего меня json) в метод POST CsvToDatabase
класса. Конечно, этот вариант не подходит для рабочего приложения. Я хотел бы знать, есть ли способ автоматически вызывать метод POST внутри класса FileUploadView
после обработки файла .csv
и получения json.
Я знаю, что могу передать POST
метод для класса FileUploadView
и вызов метода self.POST
внутри PUT
. Но сочетание функциональности значительно усложнит тестирование, поэтому я хочу использовать другой URL. Если это возможно, конечно.