做一个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',
      }

       

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值