优点:

  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 关系对象映射 基础知识点的更多相关文章

  1. 一:ORM关系对象映射(Object Relational Mapping,简称ORM)

    狼来的日子里! 奋发博取 10)django-ORM(创建,字段类型,字段参数) 一:ORM关系对象映射(Object Relational Mapping,简称ORM) ORM分两种: DB fir ...

  2. 关系/对象映射 多对多关系(@ManyToMany 注释)【重新认识】

    old: @ManyToMany 注释:表示此类是多对多关系的一边, mappedBy 属性定义了此类为双向关系的维护端, 注意:mappedBy 属性的值为此关系的另一端的属性名. 例如,在Stud ...

  3. Python与数据库[2] -> 关系对象映射/ORM[0] -> ORM 与 sqlalchemy 模块

    ORM 与 sqlalchemy 1 关于ORM / About ORM 1.1 ORM定义 / Definition of ORM ORM(Object Relational Mapping),即对 ...

  4. Python与数据库[2] -> 关系对象映射/ORM[5] -> 利用 sqlalchemy 实现关系表查询功能

    利用 sqlalchemy 实现关系表查询功能 下面的例子将完成一个通过关系表进行查询的功能,示例中的数据表均在MySQL中建立,建立过程可以使用 SQL 命令或编写 Python 适配器完成. 示例 ...

  5. Python与数据库[2] -> 关系对象映射/ORM[1] -> sqlalchemy 的基本使用示例

    sqlalchemy 的基本使用示例 下面的例子中将利用sqlalchemy进行数据库的连接,通过orm方式利用类实例属性操作的方式对数据库进行相应操作,同时应用一些常用的函数. 完整代码如下: fr ...

  6. Python与数据库[2] -> 关系对象映射/ORM[3] -> sqlalchemy 的声明层 ORM 访问方式

    sqlalchemy的声明层ORM访问方式 sqlalchemy中可以利用声明层进行表格类的建立,并利用ORM对象进行数据库的操作及访问,另一种方式为显式的 ORM 访问方式. 主要的建立步骤包括: ...

  7. Python与数据库[2] -> 关系对象映射/ORM[2] -> 建立声明层表对象的两种方式

    建立声明层表对象的两种方式 在对表对象进行建立的时候,通常有两种方式可以完成,以下是两种方式的建立过程对比 首先导入需要的模块,获取一个声明层 from sqlalchemy.sql.schema i ...

  8. Python与数据库[2] -> 关系对象映射/ORM[4] -> sqlalchemy 的显式 ORM 访问方式

    sqlalchemy 的显式 ORM 访问方式 对于sqlalchemy,可以利用一种显式的ORM方式进行访问,这种方式无需依赖声明层,而是显式地进行操作.还有一种访问方式为声明层 ORM 访问方式. ...

  9. django关系对象映射(Object Relational Mapping,简称ORM)

    Model 创建数据库,设计表结构和字段 django中遵循 Code Frist 的原则,即:根据代码中定义的类来自动生成数据库表 from django.db import models clas ...

随机推荐

  1. Kettle 4.2源码分析第一讲--Kettle 简介

    Pentaho Data Integration(PDI)简介 1. PDI结构简介 图 1‑1 PDI核心组件 Spoon是构建ETL Jobs和Transformations的工具.Spoon可以 ...

  2. ItunesConnect:上传完二进制文件后在构建版本中找不到

    最近经常遇到上传完二进制文件后在构建版本中找不到的情况: 环境:Xcode 8.2 (8C38) 大致有几种原因,可以按照以下步骤排查下. 排查步骤: 1.检查使用的权限,并info.plist文件中 ...

  3. MySQL 同一实例不同库之间表同步(Otter 应用)

    1 需求 在同一台服务器同一MySQL实例中的source库和target库都存在student表.如果source库中该表发生增删改操作时,也需要体现到target库的student表中: 2 解决 ...

  4. 【CSS3】CSS3自学

    CSS3学习网址:http://www.runoob.com/css3/css3-tutorial.html

  5. table切换(自己写)

    <!DOCTYPE HTML><html> <head> <meta charset="utf-8"> <meta name= ...

  6. mysql 表基本增删查改

    对表的操作是在某个数据库下才能进行的,所以要先选择数据库 "use 数据库名;" 1.创建数据表 1)"create table 表名 (字段1  类型  [约束],  ...

  7. 【生产问题】LDF丢失

    参考 : https://www.cnblogs.com/gered/p/9450622.html CREATE DATABASE db_logs ON PRIMARY ( NAME % ) LOG ...

  8. mysql 内置功能 存储过程 创建无参存储过程

    操作哪个数据库,就把存储过程建到那个数据库 例如 现在use db2; 应该把存储过程 建立到db2数据库里 创建无参存储过程 delimiter // # 设置mysql结束符合为// create ...

  9. 010-spring cloud gateway-过滤器-自定义局部、全局过滤器、区别

    一.自定义局部过滤器 自定义过滤器需要实现GatewayFilter和Ordered.其中GatewayFilter中的这个方法就是用来实现你的自定义的逻辑的 Mono<Void> fil ...

  10. libSVM简介及核函数模型选择

    1. libSVM简介 训练模型的结构体 struct svm_problem //储存参加计算的所有样本 { int l; //记录样本总数 double *y; //指向样本类别的组数 struc ...