1. ORM的概念&创建表
1. 什么是ORM
object relation mapping
关系映射对象 # 不单在python中有,其他语言中也有,也叫ORM
2. ORM的特点是:
在操作数据库的时候,不用再写原生SQL语句
"相对而言,执行效率低了"
3. ORM书写的位置:
models.py
4. 如何使用???
类名 >>> 表名
对象 >>> 记录
属性 >>> 字段
5. 如何来创建表???
class User(models.Model):
id = models.IntegerField(primary=True)
username = models.CharField(max_length=32) # varchar(32)
password = models.CharField(max_length=32) # 目前代码翻译不出来char类型
# 但是 ORM 支持自定义数据类型
6. 类写完之后一定要执行数据库迁移命令,才能真正的创建出来数据表
python3 manage.py makemigrations
python3 manage.py migrate
# 凡是和数据相关的都要执行以上两句话
2. ORM 对字段进行增删改查
# 增加一个字段
age = models.IntegerField()
"""
如果你的表有主键,并且主键名也叫id,那么可以省略不写,自动创建。
如果你的主键名不叫id,那么就需要指定了。
"""
3. ORM数据的增删改查
views.py
from app01 import models
def index(request):
# 增加数据
# ORM的第一种方式
res = models.User.objects.create(username="joshua", password="123")
"返回值是当前插入的数据对象"
# 第二种方式
obj = models.User(username="joshua", password="123")
obj.save() # 这才是真正的操作数据行
# 修改
# sql: update db set ... where
# ORM
res = models.User.object.filter(id=1).update(username='jk')
res = models.User.objects.filter(pk=1).update(username='jk')
"返回值是影响的行数"
# 第二种修改方式
res = models.User.objects.filter(pk=1).all()
return HttpResponse("ok")
4. 练习
5. ORM创建表关系
# mysql是关系型数据库
一对一:
# 外键字段建立在任何一方都可以,但是,推荐建在使用频率较高的一张表
一对多:
# 外键字段一定要建在多的一方
多对多:
# 外键字段不建在任何一张表,而是建在第三张关系表中
"例:"
图书表
出版社表
作者表
作者详情表
"""
图书和出版社是一对多,图书多,出版社一
图书和作者是多对多的关系,
作者表和作者详情表是一对一
"""
# 不常用的数据称之为冷数据
# 常用的数据称之为热数据
"ORM创建表关系"
1. 先创建这张表的基础字段
2. 再回头创建外键字段
class Book(models.Model):
title = models.CharField(max_length=32)
price = models.DecimalField(max_digits=8, decimal_places=2)
# 外键字段
# publish_id = models.ForeignKey(to="Publish", to_field="id")
publish_id = models.ForeignKey(to="Publish")
# 如果关联的是id字段,可以省略不写
# 建立多对多关系
authors = models.ManyToManyField(to="Author")
"""
authors是一个虚拟字段,不会真正在Book表中创建出来这个字段,
这个字段是关联第三张表的
"""
class Publish(models.Model):
addr = models.CharField(max_length=32)
class Author(models.Model):
name = models.CharField(max_length=64)
# 建立一对一
author_detail = models.OneToOneField(to="AuthorDetail")
class AuthorDetail(models.Model):
phone = models.CharField(max_length=128)