我想創建一個發送檔案以及字典形式的資訊的發布請求。我有以下實作:
# conftest.py
import pytest
@pytest.fixture
def api_client():
from rest_framework.test import APIClient
return APIClient()
使用 pytest 進行測驗:
# test_dataset.py
@pytest.mark.django_db()
class TestDatasetEndpoint:
def test_dataset_create(self, api_client):
data_raw = baker.make(Dataset)
serialized_dataset = DatasetSerializer(data_raw).data
print(serialized_dataset)
file_path = "./Top 250s in IMDB.csv"
with open(file_path, "rb") as fp:
encoded_data = encode_multipart(
BOUNDARY, {"data": serialized_dataset, "file": fp}
)
response_post = api_client.post(
reverse("datasets-list"),
encoded_data,
content_type="multipart/form-data; boundary=BOUNDARY",
)
assert response_post.status_code == 201
服務器端:
# views.py
class DatasetViewSet(viewsets.ModelViewSet):
queryset = Dataset.objects.all()
serializer_class = DatasetSerializer
def create(self, request, *args, **kwargs) -> Response:
data = request.data
return Response(request.data["data"], status=status.HTTP_201_CREATED)
最后,資料集模型是:
class Dataset(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
name = models.CharField(max_length=100)
path = models.CharField(max_length=100, editable=False, null=True, blank=True)
description = models.CharField(max_length=500, null=True, blank=True)
useCase = models.CharField(max_length=100, editable=False, null=True, blank=True)
useCaseSpecificVariable = models.CharField(
max_length=50, editable=False, null=True, blank=True
)
origin = models.CharField(max_length=50, editable=False, default="")
creationDate = models.DateTimeField(editable=False, null=True, blank=True)
workflowsUsedOn = models.JSONField(blank=True, null=True)
owners = models.JSONField(blank=True, null=True)
sampleSize = models.IntegerField(editable=False, default=0)
featureSize = models.IntegerField(editable=False, default=0)
metadataPath = models.CharField(
max_length=100, editable=False, null=True, blank=True
)
timeFrom = models.DateTimeField(editable=False, null=True, blank=True)
timeUntil = models.DateTimeField(editable=False, null=True, blank=True)
我得到的回應是字典和檔案資料的組合。我如何處理服務器端的資料和檔案(views.py)?
uj5u.com熱心網友回復:
Django 可以通過表單處理此類請求。所以模式如下:
表格.py
from django import forms
class DatasetForm(forms.Form):
class Meta:
model = Dataset
視圖.py
class DatasetViewSet(viewsets.ModelViewSet):
queryset = Dataset.objects.all()
serializer_class = DatasetSerializer
def create(self, request, *args, **kwargs) -> Response:
dataset_form = DatasetForm(request.POST, request.FILES)
if dataset_form.is_valid():
dataset = dataset_form.save()
return Response(self.serializer_class(dataset).data, status=status.HTTP_201_CREATED)
else:
return Response(dataset_form.error_messages, status=status.HTTP_400_BAD_REQUEST)
請注意,您需要有一個可以在模型上存盤檔案的欄位。例如:file = models.FileField(upload_to='attachments', blank=False)
然后字典中的欄位內容(和檔案的內容)將通過表單自動映射到相關欄位。
查看更多資訊:https ://docs.djangoproject.com/en/4.0/topics/forms/
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/426786.html
上一篇:發布請求不會回傳適當的資料
