07表关联对象及多表查询
数据库连接配置->mysql
-
安装pymysql模块
终端窗口 pip install pymsql -
创建数据库用户
1.sudo su 进入root权限模式
2.mysql 无密码直接进入mysql
3.输入命令
CREATE USER ‘用户名’@‘localhost’ IDENTIFIED BY ‘密码’;
GRANT ALL PRIVILEGES ON . TO ‘用户名’@‘localhost’ WITH GRANT OPTION;
FLUSH PRIVILEGES;
4.su - 用户名 从root权限模式切换为普通用户模式
5.mysql -u用户名 -p
password:输入密码登录
6.更改密码
ALTER USER ‘root’@‘localhost’ IDENTIFIED WITH mysql_native_password BY ‘1234’;
FLUSH PRIVILEGES; -
创建数据库 终端窗口中
- mysql -u用户名 -p密码
- create database 库名;
-
修改项目文件夹
-
项目settings.py中
DATABASES = {
‘default’: {
‘ENGINE’: ‘django.db.backends.mysql’,
‘NAME’: ‘crm’,
‘USER’: ‘ubuntu’,
‘PASSWORD’:‘zonexxlcode’,
‘HOST’:‘127.0.0.1’,
‘PORT’:‘3306’
}
} -
init.py中
import pymysql
pymysql.install_as_MySQLdb()
-
-
设置时区
TIME_ZONE = ‘Asia/ShangHai’ #北京时间
USE_TZ = False
Django的ORM系统
对象关系映射(Object relational mapping),简单地说
就是用面向对象的方式,描述数据库,操作数据库,即不用
SQL语句就能对数据库进行增删改查操作
**一个实例对应一条数据**
模型的创建与映射
每一个模型都是django.db.models.Model的子类
每个模型都有类变量,用以表示模型中的数据库字段
每一个类变量的本质是字段类的实例化
-
模型(表)的创建
注意:如果没有id字段,django将会自动帮你创建一个id字段,并且作为主键
models.py:
from django.db import models
#Create your models here.
class Student(models.Model):
name = models.CharField(max_length=20)
age = models.SmallIntegerField(default=0)
sex = models.SmallIntegerField
qq = models.CharField(max_length=20,default='')
phone = models.CharField(max_length=20,default='')
c_time = models.DateTimeField(verbose_name='创建时间',auto_now_add=True)
-
模型的激活
-
在项目中注册app
-
运行数据库迁移命令 (项目根目录下):
python manage.py makemigrations [teacher]
在 remote host中下载开头为000n_的迁移文件 -
[从迁移文件中查看sql语句]:
python manage.py sqlmigrate teacher 0001
结果Terminal:
一
一Create model Student
一
CREATE TABLEteacher_student
(id
integer AUTO_INCREMENT NOT NULL PRIMARY KEY,name
varchar(20) NOT NULL,age
smallint NOT NULL,qq
varchar(20) NOT NULL,phone
varchar(20) NOT NULL,c_time
datetime(6) NOT NULL); -
python manage.py migrate [appname] 使迁移生效
-
数据的增删改查
工具 django shell 调试工具
安装ipython pip install ipython
python manage.py shell(默认进入ipython)
1.查询表中的一条/多条数据
from appname.models import Student
- res=Student.objects.all() 返回的是一个查询集
res 是一个查询集,可以索引,可以迭代,可以切片
s.query 查询集对应的sql查询语句
-
Student.objects.filter() 返回的也是一个查询集
-
Studen.objects.get() 返回的是一个对象 注意:只能返回一个对象,因此通常参数为主键 ,也可以通过主键的序列pk查询
-
get_or_create()
2.增加一条数据
首先创建一个 Student 类的实例,作为表中的第一条数据
s2 = Student(字段=值)
s2.save()
使用 实例的save 方法 将其保存到数据库中
或者也可以先实例化对象,在传参
s3 = Student()
s3.字段=值
s3.save()
注意:在models.py模型(类/表) 中定义的 方法 对数据库不会造成任何影响,不需要迁移
def __str__(self):
return '%s-%s' % (self.name,self.age)
_ str _方法 不会对数据库造成任何影响,它可以使得管理器objects的all方法 按照str方法返回的形式 返回数据
第三种方式 创建一条数据
Student.objects.create()
或者通过Student.objects.get_or_create() 同样的方式,有则查询,无则添加,无返回true,有返回false
3.修改一条/多条数据
-
通过get获取一个对象 直接选择实例属性(字段) 进行修改
-
Student.objects.filter(条件).update(结果)
-
Student.objects.update(结果) #所有
-
对查询集(多条数据) 进行修改
4.删除一条数据
- s.delete() 可以对对象进行操作,也可以对查询集进行操作
- Students.objects.filter(参数).delete()
在视图views.py中进行同样的脚本操作
from teacher.models import Student
def index(request):
stusInDB=Student.objects.all()
#作为变量传入到模板中
return render(request,"teacher/index.html",context={
'模板变量':stusInDB
}