第12次08: 省市县区三级联动收货地址

第1步:在areas应用下models.py中定义地区模型类

from django.db import models


class Area(models.Model):
    """省市区"""
    name = models.CharField(verbose_name='名称', max_length=20)
    # related_name用于自定义反向查询的名称
    parent = models.ForeignKey('self', on_delete=models.SET_NULL, related_name='subs', null=True, blank=True,
                               verbose_name='上级行政区划')

    class Meta:
        db_table = 'tb_areas'
        verbose_name = '省市区'
        verbose_name_plural = '省市区'

    def __str__(self):
        return f"name:{self.name},parent:{self.parent}"

第2步:生成迁移文件和执行迁移文件

第3步:将areas.sql文件导入数据库

第4步:在areas应用下,定义视图

import logging

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

from .models import Area
from xiaoyu_mall.utils.response_code import RETCODE

# 日志对象
logger = logging.getLogger('django')


# Create your views here.
class AreasView(View):
    def get(self, request):
        """省市区数据查询"""
        area_id = request.GET.get('area_id')
        if not area_id:
            # area_id为空时,提供省级数据
            # 先查缓存
            province_list = cache.get('province_list')
            print("缓存数据:",province_list)
            # 缓存中没有再从数据库读,并添加到缓存
            if not province_list:
                try:
                    province_model_list = Area.objects.filter(parent__isnull=True)
                    province_list = []
                    for province_model in province_model_list:
                        province_list.append({'id': province_model.id, 'name': province_model.name})
                    # 使用过的,添加到缓存
                    cache.set('province_list', province_list, 3600)
                    # print(cache.get('province_list'))

                except Exception as e:
                    logger.error(e)
                    return JsonResponse({'code': RETCODE.DBERR, 'errmsg': '省份数据错误'})

            return JsonResponse({'area_list': province_list})
        else:
            # area_id不为空时,提供市或区数据
            # 先从缓存读妈
            sub_data = cache.get('sub_data')
            print(sub_data)
            # 缓存中读不到,再读库,并添加到缓存
            if not sub_data:
                try:
                    parent_model = Area.objects.get(id=area_id)
                    print(parent_model)
                    sub_model_list = parent_model.subs.all()  # 查询下级

                    # 序列化市、区数据
                    sub_list = []
                    for sub_model in sub_model_list:
                        sub_list.append({'id': sub_model.id, 'name': sub_model.name})

                    sub_data = {'id': parent_model.id, 'name': parent_model.name, 'subs': sub_list}
                    print(sub_data)
                    # 添加到缓存
                    cache.set('sub_data', sub_data, 3600)
                except Exception as e:
                    logger.error(e)
                    return JsonResponse({'code': RETCODE.DBERR, 'errmsg': '城市或区数据错误'})

            return JsonResponse({'code': RETCODE.OK, 'errmsg': 'OK', 'sub_data': sub_data})

第5步:配置根路由和areas应用子路由

path('', include('areas.urls')),
from django.urls import path
from . import views

urlpatterns = [
    path('areas/', views.AreasView.as_view()),
]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值