1. 程式人生 > >【集控總結】DRF幾種常用檢視的格式

【集控總結】DRF幾種常用檢視的格式

如圖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)
    ...