以web頁面實現省市區展示爲例
models.py
from django.db import models
# Create your models here.
class Area(models.Model):
"""省市區"""
name = models.CharField(max_length=20, verbose_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 self.name
parent = models.ForeignKey('self', on_delete=models.SET_NULL, related_name='subs', null=True, blank=True, verbose_name='上級行政區劃')
參數說明
self: 自關聯
from django.shortcuts import render
from django.views import View
from django import http
import logging
from django.core.cache import cache
from areas.models import Area
from meiduo_mall.utils.response_code import RETCODE
# Create your views here.
logger = logging.getLogger('django')
class AreaView(View):
"""省市區三級聯動"""
def get(self, request):
# 判斷當前是要查詢省份數據還是市區數據
area_id = request.GET.get('area_id')
if not area_id:
# 獲取並判斷是否有緩存
province_list = cache.get('province_list')
if not province_list:
# 查詢省級數據
# Area.objects.filter(屬性名__條件表達式=值)
try:
province_model_list = Area.objects.filter(parent__isnull=True)
# 將模型列表轉成字典列表
province_list = []
for province_model in province_model_list:
province_dict = {
"id": province_model.id,
"name": province_model.name
}
province_list.append(province_dict)
# 緩存省份字典列表數據:默認存儲爲"default"的配置中
cache.set('province_list', province_list, 3600)
except Exception as e:
logger.error(e)
return http.JsonResponse({'code': RETCODE.DBERR, 'errmsg': '查詢省份數據錯誤'})
# else:
# return http.JsonResponse({'code': RETCODE.OK, 'errmsg': 'OK', 'province_list': province_list})
# 響應省級JSON數據
return http.JsonResponse({'code': RETCODE.OK, 'errmsg': 'OK', 'province_list': province_list})
else:
# 判斷是否有緩存
sub_data = cache.get('sub_area_' + area_id)
if not sub_data:
try:
# 查詢城市或區縣數據
parent_model = Area.objects.get(id=area_id)
# sub_model_list = parent_model.area_set.all()
sub_model_list = parent_model.subs.all()
# 將子級模型列表轉成字典列表
subs = []
for sub_model in sub_model_list:
sub_dict = {
"id": sub_model.id,
"name": sub_model.name,
}
subs.append(sub_dict)
# 構造子級JSON數據
sub_data = {
"id": parent_model.id,
"name": parent_model.name,
"subs": subs,
}
# 緩存城市或者區縣
cache.set('sub_area_' + area_id, sub_data, 3600)
except Exception as e:
logger.error(e)
return http.JsonResponse({'code': RETCODE.DBERR, 'errmsg': '查詢城市或區縣數據錯誤'})
# 響應城市或者區縣JSON數據
return http.JsonResponse({'code': RETCODE.OK, 'errmsg': 'OK', 'sub_data': sub_data})
# 查詢城市或區縣數據
首先需要取到城市對應的省份,或者區縣對應的城市
parent_model = Area.objects.get(id=area_id)
由省份查詢城市,或者由城市查詢區縣是一對多的查詢,ORM提供的查詢方式爲:
sub_model_list = parent_model.area_set.all()
由於定義了related_name='subs',則可以使用:
sub_model_list = parent_model.subs.all()