ORM 关系对象映射 基础知识点
优点: 1.ORM使我们通用的数据库变得更加的简单便捷。 2.可避免新手程序员写sql语句带来的性能问题。
1. 创建单表
2. 创建关键表
1). 一对一
2). 一对多
3). 多对多
创建表的语句:
python manage.py makemigrations python manage.py migrate
插入:
Author.object.create(**{'name':'wjw'})
修改:
# 方法一 author = models.Author.objects.get(id=5)
author.name = 'haha'
author.save() # 方法二
models.Author.objects.filter(id=5).update(name='haha')
查询:
.filter(**kwargs) # 集合
.all() # 集合
.get(**kwargs) # 行对象
排序:
au = models.Author.objects.order_by('-id')
.reverse() 对查询结果反向排序 .distinct() 从返回结果中去重 .count() 数量 .first() 取第一条 .last() 取最后一条 .exists() 如果QuerySet中包含数据返回true,否则返回false
一对多:
创建数据表
class Author(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerField() class Book(models.Model):
author = models.ForeignKey('Author', on_delete=models.CASCADE)
namebook = models.CharField(max_length=32)
nametype = models.CharField(max_length=32)
正向查询
# 正向查询
obj = models.Book.objects.filter(namebook='python')[0]
print(obj.author.name)
# 连级查询
obj = models.Book.objects.values('namebook', 'author__name')[0]
print(obj['namebook'] + "++++" + obj['author__name'])
反向查询
# 反向查询
obj = models.Author.objects.filter(name='lixiangshuai')[0]
list = obj.book_set.all().values('namebook')
print(list)
for item in list:
print(item['namebook'])
多对多:
创建多对多数据表
class Teacher(models.Model):
name = models.CharField(max_length=32)
sex = models.CharField(max_length=32) class Student(models.Model):
name = models.CharField(max_length=32)
sex = models.CharField(max_length=32)
teacher = models.ManyToManyField('Teacher')
正向查询
s = models.Student.objects.filter(name='wangjiawei')[0]
t = s.teacher.all()
for i in t:
print(i.name)
反向查询
t = models.Teacher.objects.get(name='zhangjiong')
s = t.student_set.all()
# s = t.student_set.all().values('name')
for i in s:
print(i.name)
基于 __ (双下划綫)的条件查找:
只适用于单表
id__lt = 10, id__gt = 1 # id>1 并且 id<10
id__in = [11, 22, 33] # id = 11,22,33,的数据
.exclude(id__in=[11, 22, 33]) # not in
id__range = [1,2] # 范围 bettween··· and ···
name__contains = 'ven'
name__icontains = 'ven' # icontains 大小写不敏感
__startwith = 'p' # 开头是 p
聚合查询
.aggregate(*args, **kwargs) # 平均价格
.aggregate(avarage_price = Avg('price'))
>>> {'avarage_price':34.35}
Avg 平均值
Min 最小值
Max 最大值
Sum 求和
分组查询
annotate(*args, **kwargs) models.Author.objects.values('author__name').annotate(sum('price'))
完成~! 收工!!~!~!
ORM 关系对象映射 基础知识点的更多相关文章
- 一:ORM关系对象映射(Object Relational Mapping,简称ORM)
狼来的日子里! 奋发博取 10)django-ORM(创建,字段类型,字段参数) 一:ORM关系对象映射(Object Relational Mapping,简称ORM) ORM分两种: DB fir ...
- 关系/对象映射 多对多关系(@ManyToMany 注释)【重新认识】
old: @ManyToMany 注释:表示此类是多对多关系的一边, mappedBy 属性定义了此类为双向关系的维护端, 注意:mappedBy 属性的值为此关系的另一端的属性名. 例如,在Stud ...
- Python与数据库[2] -> 关系对象映射/ORM[0] -> ORM 与 sqlalchemy 模块
ORM 与 sqlalchemy 1 关于ORM / About ORM 1.1 ORM定义 / Definition of ORM ORM(Object Relational Mapping),即对 ...
- Python与数据库[2] -> 关系对象映射/ORM[5] -> 利用 sqlalchemy 实现关系表查询功能
利用 sqlalchemy 实现关系表查询功能 下面的例子将完成一个通过关系表进行查询的功能,示例中的数据表均在MySQL中建立,建立过程可以使用 SQL 命令或编写 Python 适配器完成. 示例 ...
- Python与数据库[2] -> 关系对象映射/ORM[1] -> sqlalchemy 的基本使用示例
sqlalchemy 的基本使用示例 下面的例子中将利用sqlalchemy进行数据库的连接,通过orm方式利用类实例属性操作的方式对数据库进行相应操作,同时应用一些常用的函数. 完整代码如下: fr ...
- Python与数据库[2] -> 关系对象映射/ORM[3] -> sqlalchemy 的声明层 ORM 访问方式
sqlalchemy的声明层ORM访问方式 sqlalchemy中可以利用声明层进行表格类的建立,并利用ORM对象进行数据库的操作及访问,另一种方式为显式的 ORM 访问方式. 主要的建立步骤包括: ...
- Python与数据库[2] -> 关系对象映射/ORM[2] -> 建立声明层表对象的两种方式
建立声明层表对象的两种方式 在对表对象进行建立的时候,通常有两种方式可以完成,以下是两种方式的建立过程对比 首先导入需要的模块,获取一个声明层 from sqlalchemy.sql.schema i ...
- Python与数据库[2] -> 关系对象映射/ORM[4] -> sqlalchemy 的显式 ORM 访问方式
sqlalchemy 的显式 ORM 访问方式 对于sqlalchemy,可以利用一种显式的ORM方式进行访问,这种方式无需依赖声明层,而是显式地进行操作.还有一种访问方式为声明层 ORM 访问方式. ...
- django关系对象映射(Object Relational Mapping,简称ORM)
Model 创建数据库,设计表结构和字段 django中遵循 Code Frist 的原则,即:根据代码中定义的类来自动生成数据库表 from django.db import models clas ...
随机推荐
- opencv学习笔记——时间计算函数getTickCount()和getTickFrequency()
cv::getTickCount()可以用来测量一段代码的运行时间,这个函数返回从上次开机算起的时钟周期数. 由于我们需要的是某个代码段运行的毫秒数,因此还需要另一个函数cv::getTickFreq ...
- LoadRunner-参数化(连接数据库)
多用户并发测试,用户信息来自数据库,对脚本中accounts值替换为参数后,打开参数列表. 1.点击 Data Wizard...:选择Specify SQL statement manu: 2.点击 ...
- HTML5 桌面提示
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- shidebing——QandA:解决一个需求20171214
list1 = [ {'eip': 60, 'day': '2014-7-5'}, {'etans': 96, 'day': '2014-7-5'}, {'etans': 30, 'day': '20 ...
- http如何301到https呢?
HTTPS协议的站点信息更加安全,同时可降低网站被劫持的风险,Firefox和chrome浏览器对访问一些非https站点会提示风险,BD等搜索引擎也明确表态了对https站点的友好.那么我们如何部署 ...
- you
抑制幽门螺旋杆菌: 1.西兰花 鲜嫩的西兰花蔬菜,含有一种物质叫异硫氰酸酯,这种物质就是幽门螺杆菌的 " 天敌 ",可达到百分百抑制的作用,甚至还有医生给了它一个最强天然抗生素的称 ...
- windows 环境下安装elasticsearch ,ik,head,marvel
elasticsearch 自带的中分分词器将会使中文分成一个一个的单词,需要安装ik分词等,ik分词分为 ik_smart(粗粒度分词),ik_max_word(细粒度分词)两种模式. 1:首先安 ...
- [py]python面向对象的str getattr特殊方法
本文旨在说清楚 类中的 def init def str def getattr 这三个方法怎么用的. 定制输入实例名时输出内容 def __str__会定制输出实例名时候的输出 class Chai ...
- 用Python实现的数据结构与算法:开篇
一.概述 用Python实现的数据结构与算法 涵盖了常用的数据结构与算法(全部由Python语言实现),是 Problem Solving with Algorithms and Data Struc ...
- [LeetCode] 867. Transpose Matrix_Easy
Given a matrix A, return the transpose of A. The transpose of a matrix is the matrix flipped over it ...