【集控總結】DRF幾種常用檢視的格式
阿新 • • 發佈:2019-02-12
如圖1所示,上一篇文章就是使用方法寫的檢視。
2,使用API檢視寫檢視層
from rest_framework.views import APIView class TaskView(APIView): def get(self, request): pass def post(self, request): pass def put(self, request): pass def delete(self, request): pass -------------------------------------------------------------- urls.py urlpatterns = [ url('^task/$', views.TaskView.as_view()) ]
3,使用泛型寫檢視。
這種方式如果有過濾,分頁,排序之類的就比較方便。使用檢視集的方式的話,我覺得也沒差多少,我更喜歡這種方式。
from rest_framework import generics from rest_framework.pagination import PageNumberPagination from django_filters.rest_framework import DjangoFilterBackend class WarnPagination(PageNumberPagination): page_size = 10 page_size_query_param = 'page_size' page_query_param = "page" max_page_size = 100 class equipmentApiView(generics.ListAPIView): serializer_class = equipmentWarnSerializer filter_fields = ('dept_id', "status", "robot_id", "type") filter_backends = (DjangoFilterBackend, filters.OrderingFilter) pagination_class = WarnPagination ordering_fields = ('dtime', 'level') def get_queryset(self): start_time = self.request.query_params.get('start_time') end_time = self.request.query_params.get('end_time') if all([start_time, end_time]): queryset = EquipmentWarn.objects.filter(dtime__gte=start_time, dtime__lte=end_time) else: queryset = EquipmentWarn.objects.all() return queryset
過濾的話還能使用的Django的的的過濾器自己寫個過濾類,但是我用的過濾比較簡單就不用了。
4,再這裡也寫下序列化到常用操作吧。
from rest_framework import serializers class PositionSerializer(serializers.ModelSerializer): area_name = serializers.CharField(source='area.name') class Meta: model = Position fields = ('id', 'name', 'area_name', 'type') class TaskPositionSerializer(serializers.ModelSerializer): position = PositionSerializer() class Meta: model = Task_position fields = ('position',)
fields =“__ all__”如果想使用全部欄位可以這樣寫
欄位如果是單獨填一個欄位,必須是元組
序列化可以關聯外檢檢視序列化其他資訊。可以使用以上的兩種方式。
如果只是查外來鍵的單獨一個資訊使用第一種方式比較好。
無關:常用導包總結,不用每次都忘記複製黏貼。
from rest_framework.decorators import api_view
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework import generics
from rest_framework.pagination import PageNumberPagination
from rest_framework import filters
import logging # 日誌操作
from django.contrib.auth.decorators import login_required # 登入驗證
from django.utils.decorators import method_decorator # 用於類方法的裝飾器
from django.db import connection, transaction # 資料庫操作
logger = logging.getLogger('jikong')
# 開啟事務,如果沒有捕捉到錯誤,則正常寫入資料庫,如果有報錯,則返回到原點
try:
with transaction.atomic():
pass
except Exception as e:
logger.error(e)
...