我是靠谱客的博主 飘逸烧鹅,最近开发中收集的这篇文章主要介绍收货地址——省市区三级联动(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数据库缓存设计

在这里插入图片描述

最后

以上就是飘逸烧鹅为你收集整理的收货地址——省市区三级联动(Redis缓存设计)的全部内容,希望文章能够帮你解决收货地址——省市区三级联动(Redis缓存设计)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(34)

评论列表共有 0 条评论

立即
投稿
返回
顶部