收货地址——省市区三级联动(Redis缓存设计)

0、Django工程中,新建areas子应用
1、编辑areas/models.py并新建模型类如下
from django.db import models

# Create your models here.

# 设计Area模型类,记录省市区数据
class Area(models.Model):
    """
    行政区划
    """
    # 创建 name 字段, 用户保存名称
    name = models.CharField(max_length=20, verbose_name='名称')
    # 自关联字段 parent
    parent = models.ForeignKey('self', on_delete=models.SET_NULL, related_name='subs', null=True, blank=True, verbose_name='上级行政区划')

    class Meta:
        db_table = 'tb_areas'

    def __str__(self):
        return self.name
2、迁移建表
# 1、进入工程目录
cd <外层目录>
# 2、指定应用迁移建表
python3 manage.py makemigrations areas
python3 manage.py migrate areas
3、使用脚本恢复数据

准备:在工程外层目录下新建scripts文件夹,areas.sql数据脚本放入该目录

cd scripts
mysql -uroot -pmysql -h127.0.0.1 -D 数据库名 < areas.sql
4、获取省信息接口实现

4.1、编辑areas/views.py

from django.shortcuts import render
from django.views import View
from django.http import JsonResponse
from django.core.cache import cache

from .models import Area
# Create your views here.

# 新建收货地址前置接口1:获取省级行政区信息
class ProvinceAreasView(View):

    def get(self, request):

        # 通读策略步骤1:读缓存redis
        province_list = cache.get('province_list') # 缓存没有则返回None

        if not province_list:
            # 通读策略步骤2:读mysql
            provinces = Area.objects.filter(
                parent=None
                # parent__isnull=True # 等价parent=None
            )

            province_list = [] # province_list就是需要被缓存读数据
            for province in provinces:
                # province:Area对象(省对象)
                province_list.append({
                    'id': province.id,
                    'name': province.name
                })
            # 通读策略步骤3:缓存回填
            cache.set('province_list', province_list, 3600)

        # 4、构建响应
        return JsonResponse({
            'code': 0,
            'errmsg': 'ok',
            'province_list': province_list
        })

5、获取市区信息接口实现

5.1、编辑areas/views.py

from django.shortcuts import render
from django.views import View
from django.http import JsonResponse
from django.core.cache import cache

from .models import Area
# Create your views here.

# 新建收货地址前置接口2:获取市、区信息
class SubAreasView(View):

    def get(self, request, pk):

        # 根据pk过滤出子级行政区信息返回
        # area是父级行政区(所有省)
        area = Area.objects.get(pk=pk)

        sub_data = {
            'id': area.id,
            'name': area.name,
            'subs': []
        }

        # 通读策略步骤1:读缓存redis
        subs = cache.get("sub_area_%d"%area.id)

        if not subs:
            # 通读策略步骤2:读mysql
            # 子级行政区
            sub_areas = area.subs.all()
            sub_data['subs'] = []

            for sub_area in sub_areas:
                # sub_area是子级行政区Area对象
                sub_data['subs'].append({
                    'id': sub_area.id,
                    'name': sub_area.name
                })
            # 通读策略步骤3:缓存回填
            # "sub_area_440000" : [{}....]
            cache.set(
                "sub_area_%d"%area.id,
                sub_data['subs'],
                3600
            )
        else:
            # 如果缓存读到了,则把响应参数中的subs重新赋值为缓存读到读子级行政区数据
            sub_data['subs'] = subs

        # 4、构建响应
        return JsonResponse({
            'code': 0,
            'errmsg': 'ok',
            'sub_data': sub_data
        })
6、Redis数据库缓存设计

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值