Python的後端筆記(五-2)

GaryLin
Gary的程式學習紀錄簿
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},
}

這樣就可以帶空了

--

--