你好,我正在尝试使用django制作计算REST API。
我的目标是将preprocessed_data(result)保存到db表字段中
这个过程是从数据库读取原始数据路径(txt文件),然后使用pandas & numpy进行计算,然后将结果txt文件保存到数据库预处理数据字段中。
这是我的models.py
class PreprocessData(models.Model):
raw = models.FileField(
upload_to=_user_directory_path,
storage=OverwriteStorage(),
preprocessed_data = models.CharField(
max_length=200,
null=True,
blank=True,
)
)
和views.py
class PreprocessCalculate(APIView):
def _get_object(self, pk):
try:
data = PreprocessData.objects.get(id=pk)
return data
except PreprocessData.DoesNotExist:
raise NotFound
#get or put or post which is the best design for api?
# PUT API
def put(self, request, pk):
data = self._get_object(pk)
serializer = PreprocessCalculateSerializer(data, request.data, partial=True)
if serializer.is_valid():
updated_serializer = serializer.save()
return Response(PreprocessDataSerializer(updated_serializer).data)
else:
return Response(serializer.errors, status=HTTP_400_BAD_REQUEST)
和serializers.py
class PreprocessResultField(serializers.CharField):
def to_representation(self, value) -> str:
ret = {"result": value.test_func()}
return ret
def to_internal_value(self, data):
return data["result"]
class PreprocessCalculateSerializer(serializers.ModelSerializer):
preprocessed_data = PreprocessResultField()
class Meta:
model = PreprocessData
fields = ("uuid", "preprocessed_data")
我的问题是
1.使用上面的代码。在数据库中,“preprocessed_field”仍然为空...自定义字段序列化程序中的问题是什么?
1.我选择“PUT”方法来计算原始文件,但我认为如果我使用“PUT”,它有一个问题,改变我的“uuid”的错误。我觉得不好。那么我应该使用GET还是POST?做restAPI计算?如果“PUT”是对的,如何保持我的数据库幂等?
请帮帮我……
1条答案
按热度按时间u59ebvdq1#
实际上,您可以使用任何您想要的方法(尽管有一些principles与之相关)。另一件重要的事情是,你需要知道你要处理什么样的文件。下面是一个简单的例子,它只接受
.csv
文件上传,读取其数据并根据request.method
的类型执行不同的过程:models.py
views.py (
extra context
on serializer)processors.py
serializers.py
关于其他问题:
使用上面的代码。在数据库中,“preprocessed_field”仍然为空...自定义字段序列化程序中的问题是什么?
在你的代码中,你返回了一个不是
string
的对象,还有一个value.test_func()
,它在任何地方都看不到,如果它返回一个字符串,那么你的.to_representation
应该返回ret['result']
。我选择“PUT”方法来计算原始文件,但我认为如果我使用“PUT”,它有一个问题,改变我的“uuid”的错误。我觉得不好。那么我应该使用GET还是POST?做restAPI计算?如果“PUT”是对的,如何保持我的数据库幂等?
正如我所说的,
POST
和PUT
是好的。同样,如果editable=False
,uuid
也不会改变。最后,对于两种请求,结果总是相同的。例如,假设一个.csv
文件包含。那么
POST
总是返回同样的方式
PUT