以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 cachefrom 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()

ORM中related_name属性的使用相关推荐

  1. C#基础系列:实现自己的ORM(反射以及Attribute在ORM中的应用)

    反射以及Attribute在ORM中的应用 一. 反射 什么是反射? 简单点吧,反射就是在运行时动态获取对象信息的方法,比如运行时知道对象有哪些属性,方法,委托等等等等. 反射有什么用呢? 反射不但让 ...

  2. 关于ORM中只有XML没有映射实体的分析

    开篇 上篇我们写了关于<关于ORM中只有XML没有映射实体的思考?期待大家的建议>这篇文章中描述了几个可能的实现思路,但是总体来说,经过大家的建议和提醒,我发现了一些比较好的思 路,在这里 ...

  3. 关于ORM中只有XML没有映射实体的思考?期待大家的建议

    开篇 很久没有写文章了,之前开了太多的系列,一方面是由于自己对于工作中的思考,另一方面是自己在业务时间中的对知识的总结,这里也是比较抱歉,因为之前开的系列,一直都是 开,完整写完的不多,这里实在是对不 ...

  4. Django中related_name的作用

    转载自:Django中related_name作用 我先定义两个模型,一个是作者,一个是作者出版的书籍,算是一对多的类型. class Person(models.Model);name = mode ...

  5. ORM中的事务和锁、Ajax异步请求和局部刷新、Ajax文件上传、日期时间类型的Json、多表查询图书系统

    一.ORM中的事务和锁 事务 事务要确保原子性 """ 事务ACID原子性:不可分隔的最小单位一致性:跟原子性是相辅相成隔离性:事务之间相互不干扰持久性:事务一旦确认永久 ...

  6. Django(22)-ORM中F对象和Q对象

    Django(1)-简介 Django(2)-创建项目及默认项目目录结构介绍 Django(3)-配置文件详解 Django(4)-URL和视图 Django(5)-路由配置实例 Django(6)- ...

  7. odoo ORM中的filed的关系映射的使用详解1

    前言 前面我们详细讲解了odoo ORM中fields中的常见属性的使用,根据不同的属性可以对字段进行不同的限制操作,比如readonly只读,store是否存储到数据库.今天我们继续研究ORM中的关 ...

  8. python私有属性怎么定义_Python中私有属性的定义方式

    Python没有类似于Java的private关键字, 但也可以为类定义私有属性. 只需将属性命名变为以__开头, 例如 __field. 示例代码: class Vector2D(object): ...

  9. php js怎么去掉类属性,如何修改DOM中的属性,类和样式

    通过jQuery来获取要修改的DOM元素,然后通过JavaScript中方法来对属性.类以及样式进行修改 今天在本篇文章中将分享的是如何通过修改html元素节点的样式,类和属性来进一步的更改dom,, ...

最新文章

  1. 智源青年科学家杨植麟:为什么预处理模型XLNet比BERT、RoBERTa更加优越
  2. 拿大厂机器学习岗 offer,吐血整理的面试秘籍!
  3. FileDownloader 很棒的文件下载库
  4. [题解]POJ 3683 Priest John's Busiest Day
  5. HIVE的安装配置、mysql的安装、hive创建表、创建分区、修改表等内容、hive beeline使用、HIVE的四种数据导入方式、使用Java代码执行hive的sql命令
  6. 【Linux系统编程学习】 文件描述符
  7. mysql linux 数据库文件位置_mysql在linux下修改mysql数据库文件位置
  8. pdo mysql 事务_PHP PDO对象如何确定它是否已经存在于MySQL事务中?
  9. 213.打家劫舍II
  10. 【微信测试号实战——02】编写你独有的微信消息模板
  11. IOS superView和subView
  12. 再见2020,你好2021(2020年度总结)
  13. 凝望深渊,并发控制的尽头
  14. nginx 地址重写 、反向代理
  15. JavaScript 数组头部、尾部进行增删元素
  16. python 检测直线 交点_OpenCV-Python教程(9、使用霍夫变换检测直线)
  17. Qt-Quick 介绍
  18. 初学者如何查阅自然语言处理领域学术资料(转)
  19. hexo 博客小功能添加-评论、萌妹纸、相册、字数统计...
  20. 无法更改计算机背景色,Win10主题更改后背景色无法变更?这个设置麻烦禁用下...

热门文章

  1. 企业邮箱客户端如何设置Foxmail
  2. SQL Server中osql/sqlcmd的基本用法
  3. okcc呼叫中心语音失真是常见通话问题?
  4. 计算机计算未来,计算机的未来:计算理念延续 实体或消失
  5. Arch Linux 2208设置IP地址
  6. 净化网购环境 抵制虚假交易
  7. 怎么用问卷工具做市场调研?
  8. 40岁进入更年期的肌肤和面部出现一些症状调理的方法
  9. kali系统安装和汉化
  10. 为什么有人的人生跟开了挂一样?