Django与数据库交互

1 如何创建项目数据库

首先,在虚拟机数据库中建立一个与项目同名的数据库,方便管理。

(django_test) bd@DF:~$ mysql -u admin -p

输入密码,进入数据库后。

mysql> SHOW DATABASES;

查看当前所有已有的数据库,然后创建数据库。

mysql> CREATE DATABASE 'django_test';

就会有一个名为’django_test’的数据库。

+--------------------+
| Database           |
+--------------------+
| information_schema |
| django_test        |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.10 sec)

2 进行数据库与django的交互

有了数据库之后,我们需要把这个库配置到项目中,进行关系绑定。
首先在settings.py文件中的DATABASES一项:

DATABASES = {
    'default': {

        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'django_test',
        'USER': 'admin',
        'PASSWORD': 'yourpassword',
        'HOST': '127.0.0.1',
        'PORT': '3306'
    }
}

将默认的配置注释掉,然后带上自己的数据库信息.端口转发(ubuntu):

Django与数据库交互
由于需要操作mysql数据库,所以需要在虚拟环境中安装pymysql,注意:需要一定要在对应的虚拟环境中安装。
pip install mysql -i https://pypi.douban.com/simple

使用豆瓣源会快一些。然后pip list 查看自己是否已经有pymysql。有了之后,进入项目总目录下的__init__.py文件。

import pymysql

pymysql.install_as_MySQLdb()

添加两行代码,完成映射的导入。然后去我们需要进行数据库交互的app中的models.py.

from django.db import models

class User(models.Model):

    name = models.CharField(max_length=30)
    age = models.IntegerField(null=True)
    sex = models.IntegerField(null=True)
    city = models.CharField(max_length=30, null=True)
    note = models.TextField(null=True)
    create_time = models.DateTimeField(auto_now_add=True)
    update_time = models.DateTimeField(auto_now=True)

这里我们定义了很多项,然后对应的数据类型是需要注意的(根据你定义的项的数据类型来),括号里面的限定信息也需要注意。数据类型:

类型说明AutoField自动增长的IntegerField,通常不用指定,不指定时Django会自动创建属性名为id的自动增长属性BooleanField布尔字段,值为True或FalseNullBooleanField支持Null、True、False三种值CharField字符串,参数max_length表示最大字符个数TextField大文本字段,一般超过4000个字符时使用IntegerField整数DecimalField十进制浮点数, 参数max_digits表示总位数, 参数decimal_places表示小数位数FloatField浮点数DateField日期, 参数auto_now表示每次保存对象时,自动设置该字段为当前时间,用于”最后一次修改”的时间戳,它总是使用当前日期,默认为False; 参数auto_now_add表示当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为False; 参数auto_now_add和auto_now是相互排斥的,组合将会发生错误TimeField时间,参数同DateFieldDateTimeField日期时间,参数同DateFieldFileField上传文件字段ImageField继承于FileField,对上传的内容进行校验,确保是有效的图片

限定条件:

选项说明null如果为True,表示允许为空,默认值是Falseblank如果为True,则该字段允许为空白,默认值是Falsedb_column字段的名称,如果未指定,则使用属性的名称db_index若值为True, 则在表中会为此字段创建索引,默认值是Falsedefault默认值primary_key若为True,则该字段会成为模型的主键字段,默认值是False,一般作为AutoField的选项使用unique如果为True, 这个字段在表中必须有唯一值,默认值是Falsemax_length字段长度限制DateField.auto_now修改数据时,更新时间,使用save方法才会有用DateField.auto_now_add第一次添加会将当前时间设置进去,修改不会

在完成数据的导入之后,我们就要在虚拟机中进行迁移。移动到项目目录下。

python manage.py makemigrations

命令后面可以跟app名称,指定对某个app的模型进行映射,如果没有写,就所有的app都回去创建映射文件。再次之前,你必须保证你的app都在settings里面注册了。
在迁移完之后,我们需要将迁移的数据提交给数据库(在虚拟机中且在目录下):

python manage.py migrate

我们可以这样理解,迁移是将我们在user类中定义的数据项转化为create table这样的mysql语句,然后就是将语句提交到数据库中创建表。
创建完成后,我们在数据库中查看是否完成操作:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| django_test        |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

mysql> use django_test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+-----------------------+
| Tables_in_django_test |
+-----------------------+
| django_migrations     |
| six_user              |
+-----------------------+
2 rows in set (0.00 sec)

mysql> describe six_user;
+-------------+-------------+------+-----+---------+----------------+
| Field       | Type        | Null | Key | Default | Extra          |
+-------------+-------------+------+-----+---------+----------------+
| id          | int(11)     | NO   | PRI | NULL    | auto_increment |
| name        | varchar(30) | NO   |     | NULL    |                |
| age         | int(11)     | YES  |     | NULL    |                |
| sex         | int(11)     | YES  |     | NULL    |                |
| note        | longtext    | YES  |     | NULL    |                |
| create_time | datetime(6) | NO   |     | NULL    |                |
| update_time | datetime(6) | NO   |     | NULL    |                |
| city        | varchar(30) | YES  |     | NULL    |                |
+-------------+-------------+------+-----+---------+----------------+
8 rows in set (0.00 sec)

这里我们首先show databases;查看库,再进入我们的项目数据库,选择six_user查看表格。完成实现数据表创建操作。

如果我们需要修改表,那么我们只需要修改模型类就可以了,如果我们需要在模型类中添加一个字段,那么我们不能直接增加,因为增加一个不可为空的字段会存在一个逻辑错误。即添加一个本身为空(添加进去的时候是空的)的不可为空字段是不被允许的,所以我们需要在括号中添加null=True。
如上面模型类的city字段,添加完成后,进行迁移和提交即可,就是上面两个步骤,删除也是一样的,也就是说,只要是更新模型类,都需要上面2个步骤。

3 添加数据

如果我们需要添加数据,我们试一下

from django.http import HttpResponse, HttpResponseNotFound
from django.shortcuts import redirect, render
from .models import User

def add_user(request):

    user, flag = User.objects.get_or_create(name='z1', age=10)
    message = '添加成功'
    if not flag:
        message = '已有数据'
    print(user.name, user.create_time)
    return HttpResponse(message)

这里我们首先需要引入models类中我们定义的User类,然后通过对User类实例化进行添加,以上举例了四种方法,前两种方法都需要使用save方法,后面两种是调用对象的方法直接添加数据,较为方便,这里需要讲一下最后一个方法,这个方法会判断传入数据,如果没有传入数据,就会首先创建,然后获取该数据,返回一个True,这里我在上面print了几条数据,可以去测试一下。如果是重复数据,就会不创建,返回数据,加一个False。那么我们在这里进行一个拆包,获取两个参数,然后做一个判断,这样就可以进行页面的信息传递。

mysql> SELECT * FROM six_user;
+----+------+------+------+------+----------------------------+----------------------------+------+
| id | name | age  | sex  | note | create_time                | update_time                | city |
+----+------+------+------+------+----------------------------+----------------------------+------+
|  1 | zjj  |   18 | NULL | NULL | 2021-03-10 21:40:18.246543 | 2021-03-10 21:40:18.246564 | NULL |
|  2 | zj   |   18 | NULL | NULL | 2021-03-10 21:44:36.590347 | 2021-03-10 21:44:36.590365 | NULL |
|  3 | z    |    8 | NULL | NULL | 2021-03-10 21:46:37.315176 | 2021-03-10 21:46:37.315195 | NULL |
|  4 | z1   |   10 | NULL | NULL | 2021-03-10 21:56:20.559386 | 2021-03-10 21:56:20.559421 | NULL |
+----+------+------+------+------+----------------------------+----------------------------+------+
4 rows in set (0.00 sec)

然后还有一种方法就是在前端页面添加数据,然后后端接收后添加入数据库。
第一步,在路由中添加接收信息:

from django.contrib import admin
from django.urls import path
from . import views

urlpatterns = [
    path(r'add_user//', views.add_user)
]

视图函数中:

def add_user(request, name, age):
    user, flag = User.objects.get_or_create(name=name, age=age)
    message = '添加成功'
    if not flag:
        message = '已有数据'
    print(user.name, user.create_time)
    return HttpResponse(message)

这样我们就可以在前端接收数据后,直接添加入数据库

Django与数据库交互
mysql> SELECT * FROM six_user;
+----+------+------+------+------+----------------------------+----------------------------+------+
| id | name | age  | sex  | note | create_time                | update_time                | city |
+----+------+------+------+------+----------------------------+----------------------------+------+
|  1 | zjj  |   18 | NULL | NULL | 2021-03-10 21:40:18.246543 | 2021-03-10 21:40:18.246564 | NULL |
|  2 | zj   |   18 | NULL | NULL | 2021-03-10 21:44:36.590347 | 2021-03-10 21:44:36.590365 | NULL |
|  3 | z    |    8 | NULL | NULL | 2021-03-10 21:46:37.315176 | 2021-03-10 21:46:37.315195 | NULL |
|  4 | z1   |   10 | NULL | NULL | 2021-03-10 21:56:20.559386 | 2021-03-10 21:56:20.559421 | NULL |
|  5 | zjjj |   21 | NULL | NULL | 2021-03-10 22:06:47.200072 | 2021-03-10 22:06:47.200101 | NULL |
+----+------+------+------+------+----------------------------+----------------------------+------+
5 rows in set (0.00 sec)

4 查找数据

3.1查找所有数据

查找数据方法,我们先定一个函数来试试看:

def find_user(request):

    user_list = User.objects.all()
    print(user_list)
    return HttpResponse('查询成功')

记得添加路由,然后我们在模型类下使用魔法方法修改print方法

    def __str__(self):
        return 'id=%s, name=%s, age=%s, city=%s, note=%s' % (self.id, self.name, self.age, self.city, self.note)

那么我们在print数据时可以看的清楚一些。

Django与数据库交互
上面是查询所有数据。那么如何查询一个数据呢?

3.2查询一个数据

def find_user(request):

    user = User.objects.get(id=1)
    print(user, type(user))
    return HttpResponse('查询成功')

Django与数据库交互
这里需要注意的是,get方法是用来查询唯一数据,如果你输入的条件不是唯一的,会直接报错。那么查询多个数据?

.3查询多条数据

def find_user(request):

    user_list = User.objects.filter(name=18)
    print(user_list, type(user_list))
    return HttpResponse('查询成功')

这里我们使用filter方法

Django与数据库交互
这里返回的是一个集合对象(可迭代对象,即可被for循环)。
def find_user(request):

    user_list = User.objects.filter(age=18)
    for user in user_list:
        print(user)

    return HttpResponse('查询成功')

这样就能返回多条信息。

Django与数据库交互
不仅如此,该对象还可以切片。
def find_user(request):

    user_list = User.objects.filter(age=18)

    print(user_list[0:1])
    return HttpResponse('查询成功')

还可以转型

def find_user(request):

    user_list = User.objects.filter(age=18)

    print(list(user_list))
    return HttpResponse('查询成功')

4 更新数据

更新数据的步骤就是先获得到你要修改的数据,然后对其进行重新赋值

4.1获取数据

from django.shortcuts import render
from django.http import HttpResponse
from six.models import User
from django.db.models import Count, Avg, Min, Max, Sum, F, Q

def find(request):

    rs = User.objects.all()

    rs = User.objects.first()

    rs = User.objects.last()

    rs = User.objects.filter(age=18)

    rs = User.objects.get(id=3)

这里的方法很多,可根据需要来

4.2对数据排序


    rs = User.objects.order_by('age')
    rs = User.objects.order_by('-age')

    rs = User.objects.order_by('age', '-id')

    rs = User.objects.filter(age=28).count()

    rs = User.objects.all().values()
    for i in rs:
        print(i['name'])
    print(rs)

4.3查询条件


    rs = User.objects.filter(age=18)

    rs = User.objects.filter(name__contains='j')

    rs = User.objects.filter(age__gt=18)

    rs = User.objects.filter(age__gte=18)

    rs = User.objects.filter(age__lt=18)

    rs = User.objects.filter(age__lte=18)

    rs = User.objects.filter(city__isnull=True)

    rs = User.objects.filter(name__startwith='z')

    rs = User.objects.filter(name__endwith='1')

    rs = User.objects.filter(name__in=['zj', 'zjj', 'zjjjj'])

    rs = User.objects.filter(age__range=(18, 28))

4.4聚合查询

Count, Avg, Min, Max, Sum主要有这些方法

    from django.db.models import Count, Avg, Min, Max, Sum, F, Q

    rs = User.objects.all().aggregate(Count('age'))

    rs = User.objects.all().aggregate(Avg('age'))

    rs = User.objects.all().aggregate(Max('age'))

    rs = User.objects.all().aggregate(Min('age'))

    rs = User.objects.all().aggregate(Sum('age'))

    rs = User.objects.all().aggregate(ageSum=Sum('age'))

4.5分组查询


    rs = User.objects.values('age')

    rs = rs.annotate(count=Count('age'))

    rs = User.objects.values('age').annotate(count=Count('age'))

F和Q查询

from django.db.models import F, Q

    rs = User.objects.all().update(age=F('age') + 1)

    rs = User.objects.filter(Q(name='zj') | Q(age=18))

    rs = User.objects.filter(Q(name='zjjj') & ~Q(age=28))
    print(rs)
    return HttpResponse('查找成功')

Q查询一般用于逻辑查询

Original: https://blog.csdn.net/qq_37247018/article/details/114640099
Author: 小白罢了
Title: Django与数据库交互

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/737560/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 100天精通Python(数据分析篇)——第61天:Pandas.to_datetime函数(处理时间)

    抵扣说明: 1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。 Original: https://blo…

    Python 2023年8月22日
    055
  • 在读学生自学Ubuntu20.04用C++调用matplotlib历程

    1.学习CMake 程序的编译需要用CMake,因此如果是Ubuntu小白的话,最好学一下。(小白的建议) http://file.ncnynl.com/ros/CMake%20P…

    Python 2023年9月3日
    072
  • 【Pandas 基础知识 GroupBy分组】

    前言 本文通过图解Pandas groupby分组机制,介绍了Pandas对Series,DataFrame分组的基础知识和groupby对象的两个重要属性;总结了分组的万能公式和…

    Python 2023年8月9日
    041
  • 使用 scipy.fft 进行Fourier Transform:Python 信号处理

    Fourier transform 是一个强大的概念,用于各种领域,从纯数学到音频工程甚至金融。 scipy.fft模块 傅立叶变换是许多应用中的重要工具,尤其是在科学计算和数据科…

    Python 2023年9月3日
    058
  • 人工智能、机器学习和深度学习有什么区别?

    在大数据时代,人们往往被人工智能(AI)、机器学习(ML)、深度学习(DL)这一些热词轰炸。但不少人对这些词汇的含义以及之间的关系比较模糊,甚至混为一谈。 本章作为人工智能的第一章…

    Python 2023年10月30日
    047
  • pandas数据分析(二)开始了解数据

    上篇根据自己实际工作内容,写了一个简单的程序,用于读取csv文件,简单处理后输出到excel文件。接下来想更多更深入地使用pandas进行数据分析,其实最缺的是各种各样的数据集。搜…

    Python 2023年8月6日
    044
  • Python中dataframe.groupby()根据数据属性对数据分组

    对下面代码理解错误的选项是? import pandas as pd import numpy as np data = {‘Name’: [‘语文’, ‘数学’, ‘语文’], …

    Python 2023年8月6日
    065
  • python 实验八 函数 (上)

    1.”吃饭,睡觉,打豆豆”是网络上最为流行的小笑话之一,这则笑话的具体内容如下。有个记者去南极采访一群企鹅。他问第一只企鹅:”你每天都做什么?&…

    Python 2023年8月2日
    033
  • Python中的函数、闭包、装饰器、lambda表达式、生成器和递归

    Python中的函数、闭包、装饰器和lambda表达式 函数 闭包 装饰器 lambda表达式 生成器 递归 补充知识 高阶函数 函数 文章对关于函数的所有知识进行了详细的总结和讨…

    Python 2023年8月26日
    062
  • 逻辑分析仪解析SPI数据

    ### 回答1: LA2016 逻辑 分析仪_软件是一款功能强大的软件,用于分析数字电路的信号。该软件具有简单易用的用户界面,并支持多种不同的操作系统,包括Windows和Linu…

    Python 2023年10月8日
    097
  • 支付宝的架构

    自 2008 年双 11 以来,在每年双 11 超大规模流量的冲击上,蚂蚁金服都会不断突破现有技术的极限。2010 年双 11 的支付峰值为 2 万笔/分钟,到 2017 年双 1…

    Python 2023年11月7日
    040
  • 一、接口相关知识

    一、什么是接口 解释1:服务端为客户端提供数据增删改查的桥梁,因为客户端与数据库是不能直接交互的,所以需要服务端处理,那么服务端就是客户端与数据库的桥梁,也就叫做接口。 解释2:客…

    Python 2023年8月15日
    056
  • Python学习:快速搭建python环境

    一、安装python 现在python有两个比较大的版本一个是python3.x一个是python2.x,python3.x相当于与python2.x是一个比较大的升级,但是pyt…

    Python 2023年9月22日
    078
  • SQL注入简介与原理

    数据来源 本文仅用于信息安全学习,请遵守相关法律法规,严禁用于非法途径。若观众因此作出任何危害网络安全的行为,后果自负,与本人无关。 SQL注入 首先从SQL注入存在的代码来看 假…

    Python 2023年11月9日
    051
  • 内容资产管理11问

    👇点击一键关注 主笔:邹小困、邝晴岚 主持人:增长黑盒分析师Emma 出品:增长黑盒研究组 前言 在这个信息爆炸的数据时代,各个行业正积极推进数字化转型,产业升级与技术赋能成为主题…

    Python 2023年9月15日
    061
  • JavaScript奇淫技巧:变速齿轮

    JavaScript奇淫技巧:变速齿轮 在PC时代,曾有个名为”变速齿轮”的神奇软件,可以加快或减慢系统时间。 当时常用来修改游戏速度,可实现外挂一般的效果…

    Python 2023年11月7日
    045
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球