Mr-shen

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

 

 

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

 

分类:

技术点:

相关文章:

  • 2021-11-19
  • 2021-11-07
  • 2022-12-23
  • 2021-08-02
  • 2021-12-22
  • 2021-09-09
  • 2020-01-10
猜你喜欢
  • 2021-07-25
  • 2021-11-20
  • 2021-06-13
  • 2021-10-03
  • 2021-10-07
  • 2021-04-13
相关资源
相似解决方案