做一個Django項目(2.2、返回行政區地址(三級聯動實現)並使用緩存)

  1. 實現視圖
    from rest_framework.viewsets import ReadOnlyModelViewSet
    
    from . import serializers
    # Create your views here.
    
    from .models import Area
    
    class AreasViewset(ReadOnlyModelViewSet):
        """
        內部實現兩種方法發返回單一數據和列表數據,
        當返回單一數據時返回省信息,
        返回單一數據是返回單一數據並返回它的下一級數據
        """
        # queryset = Area.objects.all()
    
        # serializer_class = serializers.AreaSerializer
        # 禁止分頁
        pagination_class = None
    
        def get_queryset(self):
            """
            根據不同業務返回不同查詢集
            :return: 查詢集
            """
            if self.action == 'list':
                # 如果是list返回一級數據
                return Area.objects.fiter(parent=None)
            else:
                return Area.objects.all()
    
        def get_serializer_class(self):
            """
            根據不同業務使用不同序列化器
            :return: 序列化器
            """
            if self.action == 'list':
                return serializers.AreaSerializer
            else:
                return serializers.SubAreaSerializer

     

  2. 實現序列化器
    from rest_framework import serializers
    
    from .models import Area
    
    class AreaSerializer(serializers.ModelSerializer):
        """省序列化器"""
    
        class Meta:
            model = Area
            fields = ['id', 'name']
    
    
    class SubAreaSerializer(serializers.ModelSerializer):
        """城市和區縣序列化器"""
        # 使用subs關聯AreaSerializer
        # area_set = AreaSerializer(many=True, read_only=True)
        # 返回省的時候將下一級數據一併返回
        subs = AreaSerializer(many=True, read_only=True)
    
        class Meta:
            model = Area
            fields = ['id', 'name', 'subs']

     

  3. 添加路由
    from rest_framework.routers import DefaultRouter
    from . import views
    
    
    router = DefaultRouter()
    router.register(r'areas', views.AreasViewset, base_name='areas')
    
    urlpatterns = []
    
    urlpatterns += router.urls

     

  4. 使用緩存
    1. 導入模塊
      pip install drf-extensions

       

    2. 在視圖集添加CacheResponseMixin即可
      from rest_framework_extensions.cache.mixins import CacheResponseMixin
      
      class AreasViewset(CacheResponseMixin, ReadOnlyModelViewSet):
              pass

       

    3. 我們想把緩存數據保存在redis中,且設置有效期,可以通過在配置文件中定義的方式來實現。

      在配置文件中增加

      # DRF擴展
      REST_FRAMEWORK_EXTENSIONS = {
          # 緩存時間
          'DEFAULT_CACHE_RESPONSE_TIMEOUT': 60 * 60,
          # 緩存存儲
          'DEFAULT_USE_CACHE': 'default',
      }

       

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章