概述
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数据库缓存设计
最后
以上就是飘逸烧鹅为你收集整理的收货地址——省市区三级联动(Redis缓存设计)的全部内容,希望文章能够帮你解决收货地址——省市区三级联动(Redis缓存设计)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复