1. django 连接数据库(MySQL)
DATABASES = {
'default' : {
'ENGINE' : 'django.db.backends.sqlite3' ,
'NAME' : os. path. join( BASE_DIR, 'db.sqlite3' ) ,
}
}
1 . 第一步配置文件中配置
DATABASES = {
'default' : {
'ENGINE' : 'django.db.backends.mysql' ,
'NAME' : 'day60' ,
'USER' : 'root' ,
'PASSWORD' : 'admin123' ,
'HOST' : '127.0.0.1' ,
'PORT' : 3306 ,
'CHARSET' : 'utf8'
}
}
2 . 代码声明
django默认用的是mysqldb模块链接MySQL
但是该模块的兼容性不好 需要手动改为用pymysql链接
你需要告诉django不要用默认的mysqldb还是用pymysql
import pymysql
pymysql. install_as_MySQLdb( )
2. Django ORM
ORM. 对象关系映射 作用:能够让一个不用sql语句的小白也能够通过python 面向对象的代码简单快捷的操作数据库 不足之处:封装程度太高 有时候sql语句的效率偏低 需要你自己写SQL语句
class User ( models. Model) :
id = models. AutoField( primary_key= True )
username = models. CharField( max_length= 32 )
password = models. IntegerField( )
python manage. py makemigrations 将操作记录记录到小本本上( migrations文件夹)
python manage. py migrate 将操作真正的同步到数据库中
1. models 模型对象书写
class User ( models. Model) :
id = models. AutoField( primary_key= True , verbose_name= '主键' )
username = models. CharField( max_length= 32 , verbose_name= '用户名' )
"""
CharField必须要指定max_length参数 不指定会直接报错
verbose_name该参数是所有字段都有的 就是用来对字段的解释
"""
password = models. IntegerField( verbose_name= '密码' )
class Author ( models. Model) :
username = models. CharField( max_length= 32 )
password = models. IntegerField( )
2. 表字段的增删改查
python manage. py makemigrations
python manage. py migrate
1 . 可以在终端内直接给出默认值
2 . 该字段可以为空
info = models. CharField( max_length= 32 , verbose_name= '个人简介' , null= True )
3 . 直接给字段设置默认值
hobby = models. CharField( max_length= 32 , verbose_name= '兴趣爱好' , default= 'study' )
直接修改代码然后执行数据库迁移的两条命令即可!
password = models. CharField( verbose_name= '密码' , max_length= 64 )
直接注释对应的字段然后执行数据库迁移的两条命令即可!
执行完毕之后字段对应的数据也都没有了
"""
在操作models.py的时候一定要细心
千万不要注释一些字段
执行迁移命令之前一定要仔细。因为删除字段后,字段对应的数据会全部删除。
"""
3. 数据简单的增删改查
1. 查询
def login ( request) :
if request. method == 'POST' :
"""
注意:如果POST请求返回403时,需要在setting.py文件中修改此处代码
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 将此处注释掉即可
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
"""
username = request. POST. get( 'username' )
password = request. POST. get( 'password' )
from app01 import models
user_obj = models. User. objects. filter ( username= username) . first( )
if user_obj:
if password == user_obj. password:
return HttpResponse( "登陆成功" )
else :
return HttpResponse( "密码错误" )
else :
return HttpResponse( "用户不存在" )
"""
# 查
res = models.User.objects.filter(username=username)
返回值你先看成是列表套数据对象的格式
它也支持索引取值 切片操作 但是不支持负数索引
它也不推荐你使用索引的方式取值
user_obj = models.User.objects.filter(username=username).first()
filter方法内可以携带多个参数 参数与参数之间默认是and关系
你可以把filter联想成where记忆
"""
2. 查询所有
user_queryset = models. User. objects. all ( )
3. 增
from app01 import models
res = models. User. objects. create( username= username, password= password)
user_obj = models. User( username= username, password= password)
user_obj. save( )
4. 改
edit_obj = models. User. objects. filter ( id = edit_id) . first( )
models. User. objects. filter ( id = edit_id) . update( username= username, password= password)
"""
将filter查询出来的列表中所有的对象全部更新 批量更新操作
只修改被修改的字段
"""
edit_obj. username = username
edit_obj. password= password
edit_obj. save( )
"""
上述方法当字段特别多的时候效率会非常的低
从头到尾将数据的所有字段全部更新一边 无论该字段是否被修改
"""
5. 删
models. User. objects. filter ( id = delete_id) . delete( )
3. ORM 如何创建表关系
"""
图书和出版社是一对多的关系 外键字段建在多的那一方 book
图书和作者是多对多的关系 需要创建第三张表来专门存储
作者与作者详情表是一对一
"""
from django. db import models
class Book ( models. Model) :
title = models. CharField( max_length= 32 )
price = models. DecimalField( max_digits= 8 , decimal_places= 2 )
"""
图书和出版社是一对多 并且书是多的一方 所以外键字段放在书表里面
"""
publish = models. ForeignKey( to= 'Publish' )
"""
如果字段对应的是ForeignKey 那么会orm会自动在字段的后面加_id (数据库中字段为 publish_id)
如果写为publish_id那么orm还是会在后面继续加_id,则数据库中字段为 publish_id_id
后面在定义ForeignKey的时候就不要自己加_id
"""
"""
图书和作者是多对多的关系 外键字段建在任意一方均可 但是推荐你建在查询频率较高的一方
"""
authors = models. ManyToManyField( to= 'Author' )
"""
authors是一个虚拟字段 主要是用来告诉orm 书籍表和作者表是多对多关系
让orm自动帮你创建第三张关系表
"""
class Publish ( models. Model) :
name = models. CharField( max_length= 32 )
addr = models. CharField( max_length= 32 )
class Author ( models. Model) :
name = models. CharField( max_length= 32 )
age = models. IntegerField( )
"""
作者与作者详情是一对一的关系 外键字段建在任意一方都可以 但是推荐你建在查询频率较高的表中
"""
author_detail = models. OneToOneField( to= 'AuthorDetail' )
"""
OneToOneField也会自动给字段加_id后缀
"""
class AuthorDetail ( models. Model) :
phone = models. BigIntegerField( )
addr = models. CharField( max_length= 32 )
"""
总结:
orm中如何定义三种关系
publish = models.ForeignKey(to='Publish') # 默认就是与出版社表的主键字段做外键关联
authors = models.ManyToManyField(to='Author')
author_detail = models.OneToOneField(to='AuthorDetail')
ForeignKey
OneToOneField
会自动在字段后面加_id后缀
在django1.X版本中外键默认都是级联更新删除的
"""
4. django请求生命周期流程图