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

it2023-08-31  65

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数据库缓存设计

最新回复(0)