Django框架之链接数据库及操做

Django框架之数据库操做

一、静态文件

一、什么是静态文件

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

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

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

二、Django静态文件配置

一、在settings配置文件中配置python

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

二、解决动态绑定问题mysql

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

{% 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请求,会自动将所请求的数据加在url后sql

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

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

action属性django

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

二、全路径

三、后缀(/login)

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

二、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')

三、pycharm链接数据库

 链接数据库后能够对数据库中数据查看与修改数据

四、Django链接数据库

须要本身手动先建立库,Django支持MySQL5.5及以上版本

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

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

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

import pymysql
pymysql.install_as_MySQLdb()

五、Django的ORM简介

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

ORM的做用:可以让一个不会数据数据库的也可以经过Python的面向对象方法,经过句点符来简单快捷的操做数据

ORM对象关系映射:

类 <<===>> 表

对象 <<===>> 记录

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

一、先去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)

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

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

    - python manage.py makemigrations

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

    - python manage.py migrate

六、字段的增删改操做

一、字段的增长

两种方式:

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

二、运行该字段为空

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

二、字段的删除

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

三、字段的修改

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

七、数据的增删改查操做

一、数据的增长

两种方式:

一、create()    

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

二、对象的绑定方法

  • 先生成一个user对象

  • 调用对象的绑定方法

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

二、数据的查找

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

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'

二、查找全部

一、filter() 括号中不听任何参数就是查全部

res = models.User.objects.filter()

二、all() 查询全部的数据

res = models.User.objects.all()

三、删除数据

先根据filter过滤出须要删除的数据所有,再用delete() 方法删除

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

四、数据的修改

一、用户如何获取须要修改的数据id,能够经过让前端get请求中携带数据id来获取

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

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

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

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

二、方式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()

 八、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

 

 

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

相关文章
相关标签/搜索