Python的後端筆記(五-2)
Published in
6 min readJan 17, 2023
補UD的views
剛剛要寫六的時候才發現忘了加update和delete的api,補一下
在views.py裡增加update和delete,因為Rest結構下會和CR網址結構不一樣,所以要建立在另一個class
class LayerDetailView(APIView):
model = Layer
queryset = model.objects.all()
serializer_class = LayerSerializer
@swagger_auto_schema(
operation_summary = '查詢單一樓層',
)
def get(self, request, pk):
try:
layer_obj = self.queryset.get(pk = pk)
except:
return CustomJsonResponse(return_code = '4000', return_message = '查無此樓層', status = status.HTTP_400_BAD_REQUEST)
serializer = self.serializer_class(layer_obj)
return CustomJsonResponse(result_data = serializer.data, status = status.HTTP_200_OK)
@swagger_auto_schema(
operation_summary = '修改樓層',
request_body = openapi.Schema(
type = openapi.TYPE_OBJECT,
properties = {
'type': openapi.Schema(
type = openapi.TYPE_STRING,
description = '樓層種類 A:地上 B:地下',
example = 'A',
),
'floor': openapi.Schema(
type = openapi.TYPE_NUMBER,
description = '樓層',
example = 1,
),
'remark': openapi.Schema(
type = openapi.TYPE_STRING,
description = '備註',
example = 'test',
),
}
),
)
@transaction.atomic
def put(self, request, pk):
type = request.data.get('type')
floor = request.data.get('floor')
name = type + '%02d' % floor + 'F';
try:
layer_obj = self.queryset.get(pk = pk)
except:
return CustomJsonResponse(return_code = '4000', return_message = '查無此樓層', status = status.HTTP_400_BAD_REQUEST)
if self.queryset.exclude(pk = pk).filter(name = name).exists():
return CustomJsonResponse('4010', '樓層重複', status = status.HTTP_400_BAD_REQUEST)
data = {
'name': name,
'type': type,
'floor': floor,
'remark': request.data.get('remark'),
'updated_user': 1,
}
serializer = self.serializer_class(layer_obj, data = data, partial = True)
serializer.is_valid(raise_exception = True)
serializer.save()
return CustomJsonResponse(result_data = serializer.data, return_message = '已成功編輯樓層', status = status.HTTP_200_OK)
@swagger_auto_schema(
operation_summary = '刪除樓層',
)
@transaction.atomic
def delete(self, request, pk):
try:
layer_obj = self.queryset.get(pk = pk)
except:
return CustomJsonResponse(return_code = '4000', return_message = '查無樓層', status = status.HTTP_400_BAD_REQUEST)
layer_obj.delete()
return CustomJsonResponse(return_message = '已成功移除樓層', status = status.HTTP_200_OK)
上面可以看到加了一些檢核,像是樓層重複的部分,這段程式碼也可以複製給前面的新增資料使用
然後在urls.py裡增加
urlpatterns = [
...
path('data/<int:pk>', LayerDetailView.as_view(), name = 'Layer detail'),
]
就可以看到swagger裡多出3個api了
接下來就可以自己試試CRUD的所有功能
這邊有人可能會測試到remark的部分,如果帶空值或輸入空白會出現錯誤訊息,這個只要修改Serializer加上下面這段就可以解決
extra_kwargs = {
'remark': {'allow_blank': True},
}
這樣就可以帶空了