django-orm 入门
一、django中的orm 概述
全名: 对象-关系-映射 (Object-Relational-Mapping 简称ORM)
1 ORM与DB(数据库)的映射关系
| ORM | DB |
|---|---|
| 类 | 表 |
| 属性 | 字段 |
| 对象 | 数据记录行 |
2 ORM属性/表字段
Django 把表模型定义为 Model,他需要继承自django.db.models中的 Model 类,只要是与数据表相关的操作,都需要继承这个类。同时ORM 对于数据库的的增删改查,也提供了一些简单的 API(Application Programming Interface 应用程序编程接口),例如 F 查询、Q 查询。
针对数据库中的字段类型,Django ORM 都有对应的 “xxxField” 来表述,见如下表格:字段类型表
| 字段 | 说明 | 字段属性 |
|---|---|---|
| AutoFiled | 默然自增主键(Primary_key=Ture),Django 默认建立id字段为主键。 | |
| CharFiled | 字符类型 | Max_length=32,字符长度必须明确 |
| IntgerFiled | 整型 int | |
| DateFiled | 年月日时间类型 | auto_now=True,数据被更新就会更新时间 ;auto_now_add=True,数据第一次参数时产生。 |
| DateTimeFiled | 年月日小时分钟秒时间类型 | auto_now=True,数据被更新就会更新时间; auto_now_add=True,数据第一次参数时产生。 |
| DecimalFiled | 混合精度的小数类型 | max_digits=3,限定数字的最大位数(包含小数位);decimal_places=2,限制小数的最大位数。 |
| BooleanFiled | 布尔字段,对应数据库 tinyint 类型数据长度只有1位。 | 值为True或False |
| TextFiled | 用于大文本 |
3 queryset对象
-
queryset是查询集,就是传到服务器上的url里面的内容。Django会对查询返回的结果集QerySet进行缓存,这里是为了提高查询效率。
也就是说,在你创建一个QuerySet对象的时候,Django并不会立即向数据库发出查询命令,只有在你需要用到这个QuerySet的时候才回去数据库查询。
-
QuerySet 可以被构造,过滤,切片,做为参数传递,这些行为都不会对数据库进行操作。只要你查询的时候才真正的操作数据库。
-
只有queryset对象才可以.query查看内部sql语句
# 只有queryset对象才可以.query查看内部sql语句
book = models.Books.objects.values_list('book_name')
print(book) # <QuerySet [('水浒传',), ('西游记',), ('红楼梦',),...>
print(book.query) # 查看内部的sql语句:SELECT `app01_books`.`book_name` FROM `app01_books`
二、基本使用
- ORM 的增删改查称为 CURD 操作
1 表操作
1.1 创建表
from django.db import modelsclass # models
class UserInfo(models.Model):
name = models.CharFiled(max_length=100)
password = models.CharFiled(max_length=100)
2 记录操作
2.1 CURD--增删改查
每个继承自 models.Model 的模型类,都会有一个 objects 对象被同时继承下来,这个对象就叫做“管理器对象”,数据库的增删改查可以用 objects 管理器对象来实现
- 添加/插入记录
(1)create
UserInfo.objects.create(name='jay',password='abc123')
(2)save(批量)
- 除了上述的
create方法之外,还有另一种方法
- 可以用于批量添加操作
- 也可以直接修改数据行
Obj=UserInfo(name="jay",password="abc123")
Obj.name="john" # name 属性值会被赋值为“john”,最后调用 `save()`方法保存
Obj.save()
- 常用查询语句
UserInfo.objects.all() #查询表中的所有记录
UserInfo.objects.filter(name_contains='j') #查询表中name含有“j”的所有记录,被使用较多
UserInfo.objects.get(name="john") #有且只有一个查询结果,如果超出一个或者没有,则抛出异常
UserInfo.objects.getlist(name="john") # key值相同,或者是一个key下有多个value值
UserInfo.objects.get(name="john").delete() #删除名字为john的记录
UserInfo.objects.get(name="john").update(name='TOM') #更新数据表的name为TOM
3 修改&删除记录
# 修改
UserInfo.objects.filter(name_contains='j').update(name='xxx',age=18)
# 删除
UserInfo.objects.filter(name_contains='j').delete()
4 数据迁移
4.1 迁移命令
- 注意使用
manage.py时所在路径,路径下要包含了manage.py文件
-python3 manage.py makemigrations # 这条命令会在migrations创建一条记录,数据库变更记录
-python3 manage.py migrate # 把更改同步到数据库
4.2 迁移删除
- 有时数据出了错乱,或者就是想清空数据库,不能直接删表就算了,而要连迁移记录一起删除,即几个
migrations文件 - 注意不要删除了
__init__.py文件
# 1 app下的migration文件
# 2 后台管理的迁移文件
from xadmin import migrations
# 3 如果用了AuthUser表,还有auth下的迁移文件
from django.contrib.auth.models import auth # auth文件夹下的migration文件夹中出了`__init__.py`之外的文件

浙公网安备 33010602011771号