Django操作数据库

Posted ygzico

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django操作数据库相关的知识,希望对你有一定的参考价值。

实现Django增删改查功能

静态文件

网站所使用的提前已经写好了的文件就是静态文件

比如:CSS、JS、第三方的组件(bootstrap、sweetalert、fontawesome)

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

针对网站所使用到的静态文件存储在一个static文件夹中(该文件需要自己手动创建)

static
    CSS     网站所用到的所有的CSS文件
    JS      网站所用到的所有的JS文件
    image   网站所用到的所有的图片文件
    第三方文件

用户在浏览器窗口之所以输入网址能够拿到对应的资源是因为后端开设了相关的资源

在这里又有了一个Django静态文件配置


Django静态文件配置

Django在配置文件中暴露了配置文件的配置信息,只需要按照固定的写法书写即可

  • settings中找到STATIC_URL = ‘/static/‘书写一下代码即可

基本配置

STATIC_URL = '/static/' # 访问后端静态资源的接口前缀  默认情况下接口前缀名与静态文件名保持一致
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static'),   # 文件夹的路径
    os.path.join(BASE_DIR, 'static1')
]   # 可以放多个

当接口前缀正确之后,会拿着后面的路径依次去下面列表中的每一个文件夹下查找对应的资源,顺序是从上往下依次查找,如果都没有找到才会报错

  • 问题:接口前缀名更改的话,写过的所有页面都需更改

  • 解决:动态绑定

{% 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>

form表单

默认是以get请求提交数据的

提交post请求的时候,需要先去配置文件中注释掉一行

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',
]

视图函数应该针对不同的请求,做出不同的处理逻辑

  • get请求来,应该返回一个HTML页面
  • post请求来,应该获取用户提交的数据,进行进一步处理

判断当前请求是什么请求(获取前端请求方式)

request.method  # 结果是一个纯大写的字符串  GET/POST
request.POST  # 获取post请求提交的数据 类似于是一个大字典
print(request.POST)
<QueryDict: {'username': ['yang'], 'password': ['123']}>
request.POST.get()      # 只会取列表的最后一个元素
request.POST.getlist()  # 取出整个列表
request.GET # 获取符合get请求携带数据格式的数据
request.GET.get()       # 只会取列表的最后一个元素
request.GET.getlist()   # 取出整个列表

一般情况下get请求次数要远远多于post请求,所以我们要针对post请求做出逻辑判断,将get请求直接写在函数体内而不做判断

def login(request):
    # 给用户返回一个登陆页面
    # 获取前端请求方式
    if request.method == 'POST':
        return HttpResponse('收到了 小宝贝')
    return render(request, 'login.html')

pycharm连接mysql

需要自己提前创建好对应的库

注意:如果连接不上,切换驱动重新测试

技术图片

技术图片


Django连接MySQL

需要自己提前创建好对应的库

  1. 先去配置文件中配置相关参数
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',  # 数据库类别,默认是sqlite3,需要改为我们自己的数据库类别
        'NAME': 'test',  # 库的名字
        'HOST': '127.0.0.1',
        'PORT': 3306,
        'USER': 'root',
        'PASSWORD': '123',
        'CHARSET': 'utf8'
    }
}
  1. 在项目名或者应用名目录下的__init__文件中,声明Django使用pymysql连接数据库,因为他默认是用mysqldb
import pymysql
pymysql.install_as_MySQLdb()

Django orm 简介

Django orm 只能帮我们创建表,而不能创建库

orm就是对象关系映射

对象 记录
属性 字段值

作用:能够通过Python面向对象的语法,句点符来简单快捷的操作数据

首先还是需要先去对应的应用下models.py中书写模型类(模型表)

models.py

class User(models.Model):
    id = models.AutoField(primary_key=True) # 相当于主键自增
    username = models.CharField(max_length=64)# 相当于varchar
    password = models.CharField(max_length=32)

★数据库迁移(同步)命令★

将数据库的改动记录到migrations文件夹

python3 manage.py makemigrations

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

python3 manage.py migrate

只要改动了models.py中跟数据库相关的代码,就必须重新执行上面的两条命令来保证数据库与models.py一致

技术图片

如果你没有指定主键的时候,Django orm会自动创建一个名为id的主键字段


Django 操作数据库

字段的增删改查

1.在User类中直接添加一个字段,设置一个默认值
email = models.EmailField(default='exampl@qq.com')
2.添加一个字段默认为空
hobby = models.CharField(null=True, max_length=64)
之后执行数据库迁移命令即可

连接后直接就可以看到

password字段max_length原本是32

password = models.CharField(max_length=64)
之后执行数据库迁移命令即可
只要注释掉对应的字段 执行数据库迁移命令就会将对应的字段及数据信息全部删除(慎用)

数据的增删改查

1.filter():
from app01 import models
res = models.User.objects.filter(username='yang') # 相当于select * from user where username='yang'
# 返回的结果是一个列表,支持索引取值,不支持负数,推荐使用.first()
user_obj = res.first()
# filter方法条件不存在的时候 不会报错返回的是一个空列表
2.查所有的数据
    filter()括号内不写参数
    all()   查询所有数据

filter括号内可以放多个关键字参数,并且多个关键字参数之间是and关系

1.create()
user_obj = models.User.objects.create(username=username, password=password)
# 该方法有返回值,返回值就是当前被创建的对象本身
2.对象的绑定方法
user_obj = models.User(username=username, password=password)
user_obj.save()

获取用户想要删除的数据id

delete_id = request.GET.get('delete_id')
models.User.objects.filter(id=delete_id).delete()
# 将filter过滤出来的数据全部删除   批量删除

获取用户想要修改的数据id
根据数据id获取数据并且展示到前端页面供用户查看

# 方式一
models.User.objects.filter(id=edit_id).update(username=username, password=password)
# 方式二
# 获取数据对象
edit_obj = models.User.objects.filter(id=edit_id).first()
# 修改对象属性
edit_obj.username = username
edit_obj.password = password
# 调用对象绑定方法保存
edit_obj.save()

以上是关于Django操作数据库的主要内容,如果未能解决你的问题,请参考以下文章

django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE的解决办法(转)(代码片段

Django REST框架--认证和权限

如何在 Django 中显式重置模板片段缓存?

使用 Django 模板作为片段

VSCode自定义代码片段——git命令操作一个完整流程

python 通过django片段很多很多