Django ORM整理
字段类型
# 自增长
Auto = models.AutoField()
BigAuto = models.BigAutoField()
# 二进制
Binary = models.BinaryField()
# 布尔型
Boolean = models.BooleanField()
NullBoolean = models.NullBooleanField()
# 整型
PositiveSmallInteger = models.PositiveSmallIntegerField() #正整数 5个字节
SmallInteger = models.SmallIntegerField() # 整数 6个字节
PositiveInteger = models.PositiveIntegerField() # 正整数 10个字节
Integer = models.IntegerField() # 整数 11个字节
BigInteger = models.BigIntegerField() # 整数 20个字节
# 浮点型
Float = models.FloatField()
Decimal = models.DecimalField() # 指定总位数和小数位数
# 字符串
Char = models.CharField() # 指定最大长度 数据库对应varchar
Text = models.TextField() # 不限长度 数据库对应longtext
# 时间日期类型
Date = models.DateField()
DateTime = models.DateTimeField(
Duration = models.DurationField() # 持续时间,数据表中为int,python中timedelta实现
# 其他字段
Email = models.EmailField()
Image = models.ImageField()
File = models.FileField()
FilePath = models.FilePathField()
URL = models.URLField()
UUID = models.UUIDField()
GenericIPAddress = models.GenericIPAddressField() # IPv4或者IPv6
字段参数
# 共有参数
db_column #字段名
primary_key #是否为主键
verbose_name #别名
unique #是否添加唯一约束
help_text #帮助信息
editable #是否可编辑
null #数据库是否可为空
blank #表单中是否可为空
db_index #是否添加索引
# 特殊参数
Decimal = models.DecimalField(max_digits=4, decimal_places=2) # 总共4位,其中小数点2位 11.22 16.14
Date = models.DateField(unique_for_date=True, auto_now=True) # 日期唯一 自动更新修改日期
DateTime = models.DateTimeField(unique_for_month=True, auto_now_add=True) # 月份唯一 自动更新添加日期
Char = models.CharField(max_length=100) # 最大长度
# 关系参数
one2one = models.OneToOneField(Test, related_name='one') # related_name 用于反向查询
"""on_delete 当一个被外键关联的对象被删除时,Django将模仿on_delete参数定义的SQL约束执行相应的操作
如下6种操作
CASCADE: 模拟SQL语言中的ON DELETE CASCADE约束,将定义有外键的模型对象同时删除(该操作为当前版本Django-1.11默认操作)
PROTECT: 阻止上面的删除操作,但是弹出ProtectedError异常
SET_NULL: 将外键字段设为null,只有当字段设置了null=True时,方可使用
SET_DEFAULT: 将外键字段设为默认值,只有当字段设置了default参数时,方可使用
DO_NOTHING: 什么也不做
SET(): 设置为一个传递给SET()的值或者一个回调函数的返回值,注意大小写
"""
foreign1 = models.ForeignKey(A, on_delete=models.CASCADE)
foreign2 = models.ForeignKey(A, on_delete=models.PROTECT)
foreign3 = models.ForeignKey(A, on_delete=models.SET_NULL, null=True, blank=True)
foreign4 = models.ForeignKey(A, on_delete=models.SET_DEFAULT, default=0)
foreign5 = models.ForeignKey(A, on_delete=models.DO_NOTHING)
foreign6 = models.ForeignKey(A, on_delete=models.SET)
元数据
# Model类中自带一个Meta子类用于定义模型元数据,元数据主要对数据表进行定义
db_table = 'address' # 表名称
ordering = ['pid'] # 排序
verbose_name = '省市县地址信息' # 数据表别名
verbose_name_plural = verbose_name # 复数别名
abstract = True # 只用于继承而不生成数据表
permissions = (('定义好的权限', '权限说明'),)
class Task(models.Model):
class Meta:
#自定义权限
permissions = (
("view_task", "Can see available tasks"),
("change_task_status", "Can change the status of tasks"),
("close_task", "Can remove a task by setting its status as closed"),
)
#用户检查自定义权限
user.has_perm('app.view_task')
managed = False # 是否纳入管理,False则不会生成表
unique_together = ('address', 'note') # 联合唯一键
app_label = 'courses' # INSTALLED_APPS中如果没有添加courses应用,这里需要指定
db_tablespace # 定义数据库表空间的名字
查询接口
Teacher.objects.all()
Teacher.objects.get(nickname='Jack')
Teacher.objects.filter(fans__gte=500)
Teacher.objects.filter(fans__in=[666,123]) # 在列表内
Teacher.objects.filter(nickname__icontains='A') icontains # 大小写不敏感
Teacher.objects.all()[:1] # 切片
Teacher.objects.all().order_by('-fans') # 排序
Teacher.objects.filter(fans__gte=500).order_by('nickname') # 链式查询
str(Teacher.objects.filter(fans__gte=500).order_by('nickname').query) # 查看原生SQL
Student.objects.all().exclude(nickname='A同学') # 排除
Student.objects.all().reverse() 反向排序 # models的Meta中需要添加ordering
Student.objects.all().distinct() # 去重
Student.objects.all().extra(select={'name': 'nickname'}) # 取别名
Student.objects.all().defer() # 排除某些字段
Student.objects.all().only() # 只获取某些字段
Student.objects.all().values('nickname', 'hobby') # 获取字典形式的QuerySet 分组
Student.objects.all().values_list('nickname', 'hobby') # 获取元组形式的QuerySet 分组
Student.objects.all().values_list('nickname', flat=True) # 当只有一个字段时,flat=True可以将元组中的值直接放入列表中
Student.objects.dates('created_at', 'month', order='DESC') # 根据时期获取查询集
Student.objects.datetimes('created_at', 'month', order='DESC') # 根据时期获取查询集
p_240 = Course.objects.filter(price__gte=240)
p_260 = Course.objects.filter(price__lte=260)
p_240.union(p_260) # 并集 innodb只支持并集
p_240.intersection(p_260) # 交集
p_240.difference(p_260) # 差集
courses = Course.objects.all().select_related('teacher') # 一对一 多对一查询优化
students = Student.objects.all().prefetch_related('course') # 一对多 多对多查询优化
Teacher.objects.get(nick='Jack').course_set.all() # 反向查询
Course.objects.values('teacher').annotate(vol=Sum('volume')) # 聚合计数
Course.objects.values('teacher').annotate(pri=Avg('price')) # 聚合计数
get_or_create()
Course.objects.first()
Course.objects.last()
Course.objects.earliest() # Meta中添加get_latest_by
Course.objects.latest() # Meta中添加get_latest_by
Course.objects.in_bulk(['课程1', '课程2'])
create()
bulk_create()
update_or_create()
update()
Course.objects.filter(title='test').delete()
Course.objects.filter(title='test').exists()
Course.objects.count()
Course.objects.aggregate(Max('price'),Min('price'), Avg('price'), Sum('volume'))
#F对象和Q对象
#F对象:操作字段的数据
Course.objects.update(price=F('price') - 11)
Course.objects.filter(volume__lte=F('price')*10)
#Q对象:结合AND,OR,NOT,|,~,&实现复杂的查询
Course.objects.filter(Q(title__icontains='java') & Q(volume__gte=5000))
Django ORM整理的更多相关文章
- 9.14.16 Django ORM进阶用法
2018-9-14 14:26:45 ORM 练习题 : http://www.cnblogs.com/liwenzhou/articles/8337352.html 2018-9-14 21:1 ...
- 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, 是一种程序设计技术,用于实现面向对象编程语言 ...
- Django ORM模型的一点体会
作者:Vamei 出处:http://www.cnblogs.com/vamei 严禁转载. 使用Python的Django模型的话,一般都会用它自带的ORM(Object-relational ma ...
- 数据库表反向生成(二) Django ORM inspectdb
在前一篇我们说了,mybatis-generator反向生成代码. 这里我们开始说如何在django中反向生成mysql model代码. 我们在展示django ORM反向生成之前,我们先说一下怎么 ...
- Django ORM那些相关操作
一般操作 https://docs.djangoproject.com/en/1.11/ref/models/querysets/ 官网文档 常用的操作 <1> all() ...
- django orm 及常用参数
一些说明: 表myapp_person的名称是自动生成的,如果你要自定义表名,需要在model的Meta类中指定 db_table 参数,强烈建议使用小写表名,特别是使用MySQL作为后端数据库时. ...
随机推荐
- C# 最简单的使程序单进程运行的方法
1.代码1 static void Main() { Process current = Process.GetCurrentProcess(); Process[] processes = Proc ...
- Unity初学者必备5款资源插件
Unity技术经理Sam Dogantimur为Unity初学者精心挑选和推荐了5款入门必备资源插件,涵盖游戏开发原型创作.着色器特效以及角色控制等,帮助Unity新手快速上手游戏开发. 我们将详细介 ...
- mysql索引原理及优化(二)
索引原理分析:数据结构 索引是最常见的慢查询优化方式其是一种优化查询的数据结构,MySql中的索引是用B+树实现,而B+树就是一种数据结构,可以优化查询速度,可以利用索引快速查找数据,优化查询. 可以 ...
- CMU Database Systems - MVCC
MVCC是一种用空间来换取更高的并发度的技术 对同一个对象不去update,而且记录下每一次的不同版本的值 存在不会消失,新值并不能抹杀原先的存在 所以update操作并不是对世界的真实反映,这是一种 ...
- [图片问答]LODOP字体设置方法
字体设置方法:一.整体设置(针对文本项),打印初始化后.增加打印项之前调用本函数LODOP.SET_PRINT_STYLE("FontSize",11);二.单个打印项(针对文本项 ...
- nuxt/eapress 安装报错Module build failed: ValidationError: PostCSS Loader Invalid OptionsModule build failed: ValidationError: PostCSS Loader Invalid Options options['useConfigFile'] is an invalid additi
错误信息: Module build failed: ValidationError: PostCSS Loader Invalid Options options['useConfigFile'] ...
- node + promise 实现文件读写
const fs = require('fs'); const promise = new Promise((resolve, reject) => { fs.open('./c.txt ...
- jqGrid设置单选
beforeSelectRow: function() { $(this).jqGrid('resetSelection'); return true; }
- LeetCode 856. 括号的分数(Score of Parentheses)
856. 括号的分数 856. Score of Parentheses 题目描述 给定一个平衡括号字符串 S,按下述规则计算该字符串的分数: () 得 1 分. AB 得 A + B 分,其中 A ...
- 17 JQuery高级----学习笔记
1. 动画(1) 三种方式显示和隐藏元素 <1> 默认显示和隐藏方式 1. show([speed,[easing],[fn]]) 1. 参数: 1. speed:动画的速度.三个预定义的 ...