Django框架之连接数据库及操作

Django框架之数据库操作

1、静态文件

1、什么是静态文件

网站所使用的提前已经写好的文件,如:js,css,第三方组件bootstrap、fontawesome、sweetalter等等

网站所用到的HTML文件统一放在templates文件夹中

针对所用到的静态文件放在static文件夹中,需手动创建

2、Django静态文件配置

1、在settings配置文件中配置

STATIC_URL = '/static/'  # 此处是访问静态资源的前缀,默认情况下接口前缀名与静态文件名保持一致
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'), 
                    os.path.join(BASE_DIR, 'static1'),
                    ] # 此处的static是文件夹路径,当访问时,如果前缀相同,会从这个路径下依次查找资源,都没有会报错

2、解决动态绑定问题

在配置文件中STATIC_URL改变static名使前端的HTML代码都不会改,在templates文件夹下所有HTML文件中动态引入绑定

{% load static %}
    <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
    <script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>

3、form表单中提交方式,默认是get请求,会自动将所请求的数据加在url后

http://127.0.0.1:8000/login/?username=admin&password=123

指定为 method='post' 请求就不会在url后有请求的数据,并且所有的input标签都要写name属性,否则后端接收不到所输入的内容

action属性

1、不写 默认朝当前地址提交数据

2、全路径

3、后缀(/login)

当发送post请求时,需要先配置文件中注释掉一行

2、request对象方法

视图函数应该做到针对不同的请求来做出不同的逻辑处理,比如GET请求应该返回一个HTML文件,POST请求应该获取用户提交的数据然后做一系列逻辑处理,所以我们需要判断请求方式是啥

request对象,用来获取前端的请求方式

request.method  # 结果是GET或POST
request.POST  # 获取post请求提交的数据 结果类似于一个大字典,字典的value是列表套字符串
request.POST.get('username')  # 只取列表中的最后一个元素,字符串
request.POST.getlist('username')  # 获取整个列表
request.GET  # 获取get请求url后携带的数据 结果类似于一个大字典,字典的value是列表套字符串
request.GET.get('username')  # 只取列表中的最后一个元素
request.GET.getlist('username')  # 获取整个列表

注意:POST请求,即可以通过request.PSOT获取数据,也可以通过request.GET获取携带的数据

通常情况下针对不同的请求应该做不同的判断,但是get请求次数要远大于post请求,所以我们应该对不是get请求的做判断,对get请求不做判断,减少代码层次结构

def login(request):
    if request.method == 'POST':
        return HttpResponse('登录请求收到')
    return render(request, 'login.html')

3、pycharm连接数据库

 连接数据库后可以对数据库中数据查看与修改数据

4、Django连接数据库

需要自己手动先创建库,Django支持MySQL5.5及以上版本

1、先去配置文件中配置相关的参数

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',  # 数据库类别
        'NAME': 'dome1',  # 库名
        'HOST': '127.0.0.1',
        'POST': 3306,
        'USER': 'root',
        'PASSWORD': '2694',
        'CHARSET': 'utf8'
    }
}

2、在项目名或者应用名下面的__ init__文件中告诉Django使用pymysql连接数据库而不是默认的自带mysqldb

import pymysql
pymysql.install_as_MySQLdb()

5、Django的ORM简介

Django的ORM不会帮你创建库只能帮你创建表

ORM的作用:能够让一个不会数据数据库的也能够通过Python的面向对象方法,通过句点符来简单快捷的操作数据

ORM对象关系映射:

类 <<===>> 表

对象 <<===>> 记录

属性 <<===>> 字段值

1、先去models.py文件中写模型类

class User(models.Model):
    # id可以不创建,Django ORM会自动创建一个名为id的主键字段,如果自己创建了主键就不会自动创建
    # id int primary key auto_increment
    id = models.AutoField(primary_key=True)
    username = models.CharField(max_length=64)  # 此处的char其实数据库中的是varchar,且必须提供max_length
    password = models.CharField(max_length=32)
    email = models.EmailField(default='1321241@qq.com')  # 此处的EmailField在数据库中是varchar(254)
    # price为小数字段 总共8位小数位占2位
    price = models.DecimalField(max_digits=8,decimal_places=2)

2、每一次从models类中对数据库进行改变操作都要进行:数据库迁移命令,两条命令永远成对出现,只要动了models.py对数据库进行操作,就必须要执行数据库迁移命令

  1、将数据库的改动记录到(migrations文件夹)中

    - python manage.py makemigrations

  2、将真正的改动同步到数据库中

    - python manage.py migrate

6、字段的增删改操作

1、字段的增加

两种方式:

1、要么给字段设置默认值

2、运行该字段为空

 email = models.EmailField(default='1321241@qq.com')  # 设置默认值
 hobby = models.CharField(null=True, max_length=(64))  # 设置之前设置的字段默认为空

2、字段的删除

在models中注释掉对应的字段,执行数据库迁移命令即可

3、字段的修改

修改models中对应的代码,执行数据库迁移命令即可

7、数据的增删改查操作

1、数据的增加

两种方式:

1、create()    

     # 方式一:通过create方法添加数据
        user_obj = models.User.objects.create(username=username, password=password)

2、对象的绑定方法

  • 先生成一个user对象

  • 调用对象的绑定方法

        # 方式二:先生成一个user对象,再调用对象的绑定方法
        user_obj = models.User(username=username, password=password)
        user_obj.save()

2、数据的查找

1、查单条和多条指定的数据

filter()

from app01 import models
# 相当于SQL语句的select * from user where username='Mr沈'
res = models.User.objects.filter(username='Mr沈')  # 返回是一个列表套对象,且对象不存在时,不会报错,返回空列表
user_obj = res.first()  # 支持索引取值不支持负索引,但是不建议使用,推荐使用first方法

filter()方法内可以放多个关键字参数, 并且多个关键字参数之间是and关系

res = models.User.objects.filter(username='Mr沈', password='123')
# 相当于SQL语句的select * from User where username='Mr沈' and password='123'

2、查找所有

1、filter() 括号中不放任何参数就是查所有

res = models.User.objects.filter()

2、all() 查询所有的数据

res = models.User.objects.all()

3、删除数据

先根据filter过滤出需要删除的数据全部,再用delete() 方法删除

models.User.objects.filter(id=delete_id).delete()

4、数据的修改

1、用户如何获取需要修改的数据id,可以通过让前端get请求中携带数据id来获取

 <a href="/edit_user/?edit_id={{ user_obj.id }}">编辑</a>

2、根据数据id对数据进行批量修改,两种方式:

1、方式1:update() 推荐使用

models.User.objects.filter(id=edit_id).update(name=username,password=password)

2、方式2:不推荐使用,因为会将数据库所有的数据重新写一遍,效率很慢

# 方式2(了解)
# 1 先获取数据对象
edit_obj = models.User.objects.filter(id=edit_id).first()
# 2 再修改对象属性
edit_obj.name = username
edit_obj.password = password
# 3 调用对象的绑定方法保存
edit_obj.save()

 8、Django ORM表关系创建

表关系有:一对一,一对多,多对多

以图书管理系统为例建立各表之间的关系,图书表、出版社表、作者表、作者详情表

在书写表关系的时候,要先把基表在models中全部写出来,之后再考虑外键字段,最后要执行数据库迁移命令

图书表与出版社表:是一对多的外键关键关系,外键字段应该建立在多的那一方,ForeignKey(to= '')

# 书籍与出版社 是一对多外键关系
publish = models.ForeignKey(to='Publish')  # 默认关联字段就是出版社表的主键字段
# publish = models.ForeignKey(to=Publish)  # to后面也可以直接写表的变量名 但是需要保证该变量名在当前位置的上方出现

图书表与作者表:是多对多的外键关系,外键字段建立在哪张表上都行,外键字段推荐建立在查询频率较高的那张表中,为了方便后面基于ORM查询, ManyToManyField(to= '')

# 书籍与作者   是多对多外键关系
authors = models.ManyToManyField(to='Author')  # 书籍和作者是多对多关系
"""
authors字段是一个虚拟字段 不会真正的在表中创建出来
只是用来告诉django orm 需要创建书籍和作者的第三张关系表
"""

作者表与作者详情表:是一对一的外键关系,外键字段建立在哪张表上都行,推荐建立在查询频率较高的那张表中,为了方便后面基于ORM查询,  OneToOneField(to= '')

# 一对一外键关系建立
author_detail = models.OneToOneField(to='AuthorDetail')

注意:ForeignKey字段和OneToOneFiled字段在创建表时不管用户有没有加_ id后缀都会自动在该字段名后加_id

 

 

 创建多对多表时,会自动创建第三张中间表

 

posted @ 2020-01-05 15:54  Mr沈  阅读(4587)  评论(0编辑  收藏  举报