Django-orm高级
ORM字段
orm常见字段
https://www.cnblogs.com/liuqingzheng/articles/9627915.html
choice字段注释与数据渲染
性别
sex_choices =(
(1,'male')
(2,'female'),
(3,'null')
)
sex = models.IntegerField("上课纪录", choices=sex_choices, default="3")
user_obj = models.Userinfo.objects.all().first()
# 针对choices字段,如果你想要获取数字所对应的中文,你不能直接点字段
# 固定句式,数据对象.get_字段名_display(),当没有对应关系的时候,该句式获取到的还是数字
print(user_obj.get_sex_display())
自定义字段
class FixedCharField(models.Field):
"""
自定义的char类型的字段类
"""
def __init__(self, max_length, *args, **kwargs):
self.max_length = max_length
super(FixedCharField, self).__init__(max_length=max_length, *args, **kwargs)
def db_type(self, connection):
"""
限定生成数据库表的字段类型为char,长度为max_length指定的值
"""
return 'char(%s)' % self.max_length
class Class(models.Model):
id = models.AutoField(primary_key=True)
title = models.CharField(max_length=25)
# 使用自定义的char类型的字段
cname = FixedCharField(max_length=25)
modles基表
modles里面的表有公共字段,可以提取到基表上
基表注意
设置内嵌meta类的abstract为True,默认为False(为False会创建这个表)
is_delete字段
用来做逻辑删除,因为数据是有价值的
class BaseModel(models.Model):
is_delete = models.BooleanField(default=False)
create_time = models.DateTimeField(auto_now_add=True)
class Meta:
# 基表必须设置abstract,基表就是给普通Model类继承使用的,设置了abstract就不会完成数据库迁移完成建表
abstract = True
自关联
自关联表设计
模型类中设置:null=True,表示数据库创建时该字段可不填,用NULL填充.即在Null字段显示为YES。
模型类中设置:blank=True,表示代码中创建数据库记录时该字段可传空白(空串,空字符串).表示你的表单填写该字段的时候可以不填,但是对数据库来说,没有任何影响
class AddressInfo(models.Model):
address = models.CharField(max_length=200, null=True, blank=True, verbose="地址")
pid = models.ForeignKey('self', null=True, blank=True, verbose_name="自关联")
Models去物理外键为逻辑外键
断关联的特点
1.表之间没有物理外键关联,但是有逻辑外键关联(但是要注意,由于没有物理的约束,所以要在逻辑上必须保证数据操作的安全)
2、断关联后不会影响数据库查询效率,但是会极大提高数据库增删改效率(因为少做了一步判断外键数据是否存在的操作)
db_constraint
断关联,但是级联关系还在(默认级联删除),所以要自己设置,如下
db_constraint=False
on_delete--级联删除
在django1.x中默认有,2.x中必须自己实现
on_delete=models.CASCADE
#有6种操作
CASCADE:将定义有外键的模型对象同时删除(默认)
PROTECT:阻止上面的删除操作,但是会弹出ProtectedError异常
SET_NULL:将外键字段设为null,只有当字段设置了null=True时,才可以使用
SET_DEFAULT:将外键字段设为默认值,只有当字段设置了default参数时,可以使用
DO_NOTHING:什么也不做
SET():设置为一个传递给SET()的值,或者一个回调函数的返回值。注意大小写。
注意多对多例外
1.多对多外键实际在关系表中,ORM默认关系表中两个外键都是级联
2.ManyToManyField字段不提供设置on_delete,如果想设置关系表级联,只能手动定义关系表
作者没了,详情也没:on_delete=models.CASCADE
出版社没了,书还是那个出版社出版:on_delete=models.DO_NOTHING
#下面两个比较类似
部门没了,员工没有部门(空不能):null=True, on_delete=models.SET_NULL
部门没了,员工进入默认部门(默认值):default=0, on_delete=models.SET_DEFAULT
related_name
外键字段为正向查询字段,related_name是反向查询字段
obj = models.Author.objects.filter(pk=1).first()
print(obj.detail.mobile)
obj2 = models.AuthorDetail.objects.filter(pk=1).first()
print(obj2.author.name)
only与defer
# 惰性查询
# res = models.Book.objects.all()
# res = models.Book.objects.values('title')
# res = models.Book.objects.only('title')
# for r in res:
# # print(r.title)
# print(r.price)#除了title,查询其他数据都要重新查询
"""
only会将括号内的字段对应的值 直接封装到返回给你的对象中 点该字段 不需要再走数据库
一旦你点了不是括号内的字段 就会频繁的去走数据库查询
"""
# res = models.Book.objects.defer('title') # defer和only互为反关系,除了id
# for r in res:
# print(r.title)
"""
defer会将括号内的字段排除之外将其他字段对应的值 直接封装到返回给你的对象中 点该其他字段 不需要再走数据库
一旦你点了括号内的字段 就会频繁的去走数据库查询
"""
select_related和prefetch_related
# prefetch_related
res = models.Book.objects.prefetch_related('publish')
# print(res)
for r in res:
print(r.publish.name)
"""
prefetch_related 看似连表操作 其实是类似于子查询
prefetch_related括号内只能放外键字段
并且多对多字段不能放
如果括号内外键字段所关联的表中还有外键字段 还可以继续连表
select_related(外键字段__外键字段__外键字段...)
注意
如果你使用的是django2.X版本 你在建数据库表关系的时候
你需要手动指定两个参数
(你要手动告诉django 级联更新 级联删除 是否建外键约束)
on_delete
db_constraint
django中如何开启事务
from django.db import transaction
with transaction.atomic():
# 在该代码块中所写的orm语句 同属于一个事务
缩进出来之后自动结束
Django-orm高级的更多相关文章
- django orm高级查询 F表达式和Q表达式以及分组annotate
1.关联关系映射及查询1.1django默认开启延迟加载所有多对1和1对1如果不使用select_related(),需要会延迟加载获取到相关对象,因为延迟可能会造成n+1次查询的问题,所以便有了se ...
- 建立一个更高级别的查询 API:正确使用Django ORM 的方式(转)
add by zhj: 本文作者是DabApps公司的技术主管,作者认为在view中直接使用Django提供的ORM查询方法是不好的,我对此并不赞同,可能作者 写这篇文章是给Django的初学者看,所 ...
- django orm 操作表
django orm 操作表 1.基本操作 增 models.Tb1.objects.create(c1='xx', c2='oo') 增加一条数据,可以接受字典类型数据 **kwargs inser ...
- [oldboy-django][2深入django]ORM操作
推荐学习博客:http://www.cnblogs.com/wupeiqi/articles/6216618.html 需求: 汇总django orm操作,代替原生mysql语句来操作数据库:里面内 ...
- Django ORM models操作
title: Django ORM models操作 tags: Django --- Django ORM models操作 Django ORM基本操作 一.数据库的创建及增删改查 1 使用类创建 ...
- django orm 基本
1 modle基本数据类型 class Test(models.Model): """测试学习用""" Auto = models.Auto ...
- django orm总结[转载]
django orm总结[转载] 转载地址: http://www.cnblogs.com/linjiqin/archive/2014/07/01/3817954.html 目录1.1.1 生成查询1 ...
- Django ORM - 001 - 外键表查询主表信息
开始用Django做web开发,我想大家都会遇到同样的问题,那就是如何高效快速的查询需要的数据,MVC都很简单,但是ORM折腾起来就有些费时间,我准备好好研究下Django ORM,所以会有一个系列的 ...
- Django ORM 中的批量操作
Django ORM 中的批量操作 在Hibenate中,通过批量提交SQL操作,部分地实现了数据库的批量操作.但在Django的ORM中的批量操作却要完美得多,真是一个惊喜. 数据模型定义 首先,定 ...
- Django ORM 查询管理器
Django ORM 查询管理器 ORM 查询管理器 对于 ORM 定义: 对象关系映射, Object Relational Mapping, ORM, 是一种程序设计技术,用于实现面向对象编程语言 ...
随机推荐
- Linux链接文件——软连接和硬链接
Linux链接文件——软连接和硬链接 摘要:本文主要介绍了Linux系统中的链接文件. 文件系统 在Linux系统中,将文件分为两个部分:用户数据和元数据. 元数据(inode) 元数据即文件的索引节 ...
- jQuery 杂项方法大全
下表列出了所有jQuery 杂项方法: 方法 描述 data() 将数据附加到选定元素或从中获取数据 get() 获取选择器匹配的DOM元素 index() 从匹配的元素中搜索给定的元素 $.noCo ...
- odoo12 如何设置超级用户
在odoo12的版本中,和之前的版本有点不一样的地方 在odoo12版本之前,每个实例都是使用户名为Administrator的默认用户来创建的. 在数据库中user_id是1. 在代码中,你会发现 ...
- 使用python实现后台系统的JWT认证
介绍 JWT协议似乎已经应用十分广泛,JSON Web Token--一种基于token的json格式web认证方法.基本的原理是,第一次认证通过用户名密码,服务端签发一个json格式的token.后 ...
- 【分布式搜索引擎】Elasticsearch之安装Elasticsearch可视化平台Kibana
一.Kibana简单介绍 Kibana 是为 Elasticsearch设计的开源分析和可视化平台.你可以使用 Kibana 来搜索,查看存储在 Elasticsearch 索引中的数据并与之交互.你 ...
- [linux] shell脚本编程-统计日志文件中的设备号发通知邮件
1.日志文件列表 比如:/data1/logs/2019/08/15/ 10.1.1.1.log.gz 10.1.1.2.log.gz 2.统计日志中的某关键字shell脚本 zcat *.gz|gr ...
- 7、Topic
Topics In the previous tutorial we improved our logging system. Instead of using a fanout exchange o ...
- Linux CentOs基本命令
基本操作(命令模式下) yy --复制光标所在行 nyy --n为数字,复制光标所在向下n行 p --粘贴到光标的下一行 P --贴在光标的上一行 G --光标移到文件末尾 gg --光标移到文件头 ...
- jmeter压测学习9-响应断言
前言 使用jmeter做接口压测的时候,如何能保证接口的每次返回结果都是我们预期的呢?这就需要添加检查点,也就是添加断言. 添加断言就是为了检查返回的结果与我们的预期是一致的,不用去一个个检查结果. ...
- 11-numpy笔记-莫烦基础操作1
代码 import numpy as np array = np.array([[1,2,5],[3,4,6]]) print('-1-') print('数组维度', array.ndim) pri ...