博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django ORM - 001 - 外键表查询主表信息
阅读量:5843 次
发布时间:2019-06-18

本文共 1774 字,大约阅读时间需要 5 分钟。

开始用Django做web开发,我想大家都会遇到同样的问题,那就是如何高效快速的查询需要的数据,MVC都很简单,但是ORM折腾起来就有些费时间,我准备好好研究下Django ORM,所以会有一个系列的Blog,欢迎大家讨论拍砖。

 

1. 如何快速的通过外键表获取主表的信息

演示Class

from django.db import modelsimport uuidclass Employee(models.Model):    employee_id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)        user_name = models.CharField(max_length=30)    pwd = models.CharField(max_length=50)        first_name = models.CharField(max_length=50)    last_name = models.CharField(max_length=50)    email = models.EmailField()    entry_date = models.DateTimeField(auto_now=True, editable=False)    def __str__(self):        return self.user_name
from django.db import modelsfrom datetime import datetimefrom .Employee import Employeeclass EmployeeIP(models.Model):    IP = models.GenericIPAddressField(        protocol='IPv4', unpack_ipv4=False, max_length=30, unique=True, primary_key=True)    employee = models.ForeignKey(Employee, on_delete=models.CASCADE)    def __str__(self):        return self.IP

主要用到Django的 select_related(), 它的作用是实现主外键表的关联查询,一次数据库查询拿到的QuerySet中包含主表的model实例数据,再加上一个生成表达式提取需要的信息,两行代码拿到所有数据,后面注释的是返回的JSON数据

from django.http import JsonResponsedef ip_json(request):    employee = Employee.objects.get(user_name='admin')    ip_list2 = EmployeeIP.objects.filter(employee_id=employee.employee_id).select_related()    ip_list3 = [{
"ip": x.IP, "name": x.employee.first_name + ' ' + x.employee.last_name} for x in ip_list2] return JsonResponse(ip_list3, safe=False) ''' [{ "name": "Tom", "ip": "192.168.1.110" }, { "name": "Jim", "ip": "192.168.1.111" }, { "name": "Lucy", "ip": "192.168.1.112" }] '''

 

select_related() 还支持指定深度,如果你的表格之间有多层外键应用的话最好指定,否则查询的将是一个非常大的数据集。

 

转载地址:http://nzqcx.baihongyu.com/

你可能感兴趣的文章
NS_OPTIONS枚举的用法
查看>>
QAQ高精度模板笔记√
查看>>
【Android笔记】入门篇02:全屏设置和禁止横屏竖屏切换
查看>>
Kubernetes的本质
查看>>
亚信安全参加第六届全国等保技术大会 态势感知助力“等保2.0”落地
查看>>
【设计模式系列】--抽象工厂
查看>>
JqueryValidate 动态添加验证
查看>>
大数据公司Palantir融得7亿美元 曾追踪拉登
查看>>
建立备份策略的重要性
查看>>
小白用户如何轻松上云 -我的轻量应用服务器探索记
查看>>
发力IoT领域 Marvell注重生态系统发展
查看>>
20个问题揭穿冒牌数据科学家
查看>>
你应该知道的 RPC 原理
查看>>
Ubuntu安装词典
查看>>
KVM虚拟机在线添加网卡
查看>>
Spring解析
查看>>
java设计模式之——代理模式
查看>>
python中str和repr区别
查看>>
升级win10后无法使用桥接网络解决方法
查看>>
如何进行跨网段的远程唤醒
查看>>