目录

  • pycharm是MySQL的客户端之一
  • pycharm链接数据库MySQL
  • django链接数据库
  • 将django默认的数据库sqkit3修改为MySQL
  • django ORM
  • ORM介绍
  • ORM创建表的基本操作
  • ORM操作字段的基本操作 --- 增删改查
  • 字段的增加
  • 字段的修改
  • 字段的删除
  • ORM操作表数据 --- 增删改查
  • 数据的查
  • 数据的增
  • 数据的删除和修改
  • django ORM创建表关系
  • 表与表之间的关系
  • 创建表关系

pycharm是MySQL的客户端之一

pycharm链接数据库MySQL

pycharm链接数据库的方法

参照上课视频即可

django链接数据库

将django默认的数据库sqkit3修改为MySQL

  • 第一步,修改配置文件settings.py
'''
修改前
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}
'''

# 修改后
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'practice',
        'USER':'root',
        'PASSWORD':'1026',
        'HOST':'127.0.0.1',
        'PORT':3306,
        'CHARSET':'utf8',
    }
}
  • 第二部,代码声明

django默认用的是mysqldb模块链接MySQL,但是该模块的兼容性不好,需要手动改为pymysql链接,需要告诉django不要用默认的mysqldb改为用pymysql

# 在项目名下的migrations文件夹的__init__.py文件或者任意的应用下的__init__.py文件中书写一下代码
import pymysql
pymysql.install_as_MySQLdb()

django ORM

ORM介绍

  • ORM:对象关系映射



对象

记录

对象属性

记录中某个字段对应的值

  • 作用:能够让一个不用sql语句的小白也能够通过python 面向对象的代码简单快捷的操作数据库
    不足之处:封装程度太高 有时候sql语句的效率偏低 需要你自己写SQL语句

ORM创建表的基本操作

  • 第一步,先去应用下的models.py下书写一个类,继承models.Model
from django.db import models

# Create your models here.
class Info(models.Model):
    # id int primary key auto increment
    id = models.AutoField(primary_key=True,verbose_name=id)
    # username varchar(32)
    username = models.CharField(max_length=32,verbose_name=username)
    # password int
    password = models.IntegerField(verbose_name='password')
    
# 此时并未在数据库中产生任何数据
  • 第二步,数据库迁移命令

只要修改了models.py中跟数据库相关的代码,就必须执行下述两条数据库迁移命令

python manage.py makemigrations   // 将数据记录在小本本上(migrations文件夹中会产生一个文件)
python manage.py migrate   // 将操作真正的同步到数据库中
  • 创建表的注意事项
- CharFiled必须指定max_length()参数,不指定会报错
- verbose_name参数是所有字段都有的,就是用来对字段的解释
- 由于一张表中必须要有一个主键字段,并且一般情况下都叫id字段,所以orm当你不定义主键字段的时候,orm会自动帮忙创建一个名为id的主键字段,因此,后续在创建模型表的时候入喉主键字段名没有额外的叫法,那么主键字段可以省略不写

ORM操作字段的基本操作 --- 增删改查

字段的增加

  • 在命令行中直接给出默认值
  • 设置字段可以为空
gender = models.CharField(max_length=32,null=True)
  • 直接为字段设置默认值
hobby = models.CharField(max_length=32,default='study')

字段的修改

直接修改代码,然后执行数据库迁移命令即可

字段的删除

直接注释对应的字段然后执行数据库迁移的命令即可
注意:执行完毕后,字段对应的数据也都没有了,所以,再操作models.py的时候一定要细心,不要随便注释数据,执行迁移命令之前最好检查自己的代码

ORM操作表数据 --- 增删改查

数据的查

  • 用户登录 --- 单个数据的查
def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        
        # models.Info.objects.filter(username=username)得到的是列表套数据对象的格式,支持索引取值,但是不推荐,而且不支持负数索引
        user_obj = models.Info.objects.filter(username=username).first()
        
        if user_obj:

            if password == user_obj.password:
                return HttpResponse('登陆成功')
            return HttpResponse('密码错误')
        else:
            return HttpResponse('用户名不存在')
    return render(request,'login.html')
  • 将数据库所有的数据全部展示到前端
# 获取所有用户信息展示到前端
def user_info(request):
    # 方式一 
    # data = models.Info.objects.filter()
    # 方式二
    data = models.Info.objects.all()
    return render(request,'user_info.html',locals())

数据的增

  • 用户注册
def reg(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        res = models.Info.objects.create(username=username,password=password)
        '''
        也可以使用下述代码增加
        user_obj = models.Info(username=username,password=password)
        user_obj.save()
        '''
    return render(request,'register.html')

数据的删除和修改

  • 修改功能
需求:点击前端的编辑按钮,然后修改对用的数据
问题:如何告诉后端用户想要编辑哪条数据
	 将编辑按钮所在哪一行数据的主键值发送给后端,利用url问号后面携带参数的方式
def modify(request):
    # 获取url问号后面的参数
    edit_id = request.GET.get('user_id')
    # 获取当前用户想要修改的数据对象
    edit_obj = models.Info.objects.filter(id=edit_id).first()
    if request.method == 'POST':
        # 获取用户输入的新数据
        username = request.POST.get('username')
        password = request.POST.get('password')
        # 去数据库修改对应的数据内容---方式1
        # 将filter查询出来的列表中所有的对象全部更新,批量更新操作,只修改被修改的字段
        models.Info.objects.filter(id=edit_id).update(username=username,password=password)
        '''
        修改数据方式2
        edit_obj.username = username
        edit_obj.password= password
        edit_obj.save()
        上述方法当字段特别多的时候效率会非常的低
        从头到尾将数据的所有字段全部更新一边 无论该字段是否被修改
        '''
        # 修改完跳回展示数据页面
        return redirect('/user_info/')
    else:
        # 展示修改信息的页面
        return render(request,'modify_info.html',locals())
  • 删除数据
def delete_info(request):
    # 获取用户想删除的数据的id值
    edit_id = request.GET.get('user_id')
    # 直接去数据库找到对应的数据删除即可
    models.Info.objects.filter(id=edit_id).delete()
    # 删除后跳回到展示数据页面
    return redirect('/user_info/')
'''
真正的删除功能应该需要二次确认 我们这里先不做后面会讲
删除数据内部其实并不是真正的删除 我们会给数据添加一个标识字段用来表示当前数据是否被删除了,如果数据被删了仅仅只是讲字段修改一个状态
'''
  • url.py
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^login/',views.login),
    url(r'^reg/',views.reg),
    url(r'^user_info/',views.user_info),
    url(r'^modify/',views.modify),
    url(r'^delete/',views.delete_info),
]
  • views.py
from django.shortcuts import render,HttpResponse,redirect
from app01 import models
# Create your views here.


# 登陆
def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        user_obj = models.Info.objects.filter(username=username).first()
        # 得到的是列表套数据对象的格式
        if user_obj:

            if password == user_obj.password:
                return HttpResponse('登陆成功')
            return HttpResponse('密码错误')
        else:
            return HttpResponse('用户名不存在')
    return render(request,'login.html')

# 注册
def reg(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        res = models.Info.objects.create(username=username,password=password)
    return render(request,'register.html')


# 获取所有用户信息展示到前端
def user_info(request):
    # 方式一
    # data = models.Info.objects.filter()
    # 方式二
    data = models.Info.objects.all()
    return render(request,'user_info.html',locals())

# 修改数据库信息
def modify(request):
    # 获取url问号后面的参数
    edit_id = request.GET.get('user_id')
    # 获取当前用户想要修改的数据对象
    edit_obj = models.Info.objects.filter(id=edit_id).first()
    if request.method == 'POST':
        # 获取用户输入的新数据
        username = request.POST.get('username')
        password = request.POST.get('password')
        # 去数据库修改对应的数据内容
        models.Info.objects.filter(id=edit_id).update(username=username,password=password)
        # 修改完跳回展示数据页面
        return redirect('/user_info/')
    else:
        # 展示修改信息的页面
        return render(request,'modify_info.html',locals())

# 删除数据库信息
def delete_info(request):
    # 获取用户想删除的数据的id值
    edit_id = request.GET.get('user_id')
    # 直接去数据库找到对应的数据删除即可
    models.Info.objects.filter(id=edit_id).delete()
    # 删除后跳回到展示数据页面
    return redirect('/user_info/')
'''
真正的删除功能应该需要二次确认 我们这里先不做后面会讲
删除数据内部其实并不是真正的删除 我们会给数据添加一个标识字段用来表示当前数据是否被删除了,如果数据被删了仅仅只是讲字段修改一个状态
'''
  • 更多代码详见 --- E:\pycharm\django_pro\mysite02

django ORM创建表关系

表与表之间的关系

  • 一对多:图书与出版社,外键建在查询频率高的一方
  • 多对多:图书和作者,需要创建第三张表来存储关系
  • 一对一:作者与作者详情 ,外键创建再查询频率高的一方
  • 没有关系

创建表关系

  • 先将基表创建出来,然后再添加外键字段
from django.db import models

# Create your models here.
class Book(models.Model):
    title = models.CharField(max_length=32)

    # 总共8位,小数点后占两位
    price = models.DecimalField(max_digits=8,decimal_places=2)

    '''
    图书与出版社是的一对多的关系,并且书是查询频率较高的一方,因此外键建在书籍这边
    默认就是与出版社的主键字段做外键关联
    如果字段对应的是ForeignKey,ORM会自动再字段的后面加_id
    后面在定义ForeignKey的时候不要自己加_id
    '''
    publish = models.ForeignKey(to='Publish')


    '''
    图书与作者是多对多的关系,外键字段建在任何一方都可以,推荐建在查询频率较高的一方
    authors是一个虚拟的字段,主要是用来告诉ORM,书籍和作者是多对多的关系,而且ORM会自动创建多对多关系的第三张表
    '''
    authors = models.ManyToManyField(to='Author')




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()
    '''
    作者与作者详情是一对一的关系,外键字段建在任意一方都可以,推荐建在查询频率较高的表中
    OneToOneField也会自动给字段加上_id后缀
    '''
    author_detail = models.OneToOneField(to='AuthorDetail')

class AuthorDetail(models.Model):
    phone = models.CharField(max_length=32)
    addr = models.CharField(max_length=32)
  • 总结 --- ORM如何定义三种关系
- 一对多关系 ForeignKey
 publish = models.ForeignKey(to='Publish')
    
- 多对多关系 ManyToMany
authors = models.ManyToManyField(to='Author')

- 一对一关系 OneToOne
author_detail = models.OneToOneField(to='AuthorDetail')

ForeignKey  OneToOne会自动在外键字段加上_id后缀
  • 其他
在django1.X版本中外键默认都是级联更新删除的
多对多的表关系可以有好几种创建方式 这里暂且先介绍一种