055.Python前端Django模型ORM
由于前面在centos实验的过程中,pymql一直有属性错误,很难排查出问题,重新做了一个ubuntu的桌面系统同时使用pycharm开发工具作为学习开发工具,具体原因是因为在项目命名出现问题,和自己带的模块冲突,导致不能成功
一 ORM简介
对象关系映射(Object Relational Mapping,简称ORM)。
简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。ORM在业务逻辑层和数据库层之间充当了桥梁的作用。
通过一张图来介绍一下数据库与python代码之间的一个关系:
1.1 ORM特点
ORM的优点
- 不用写繁琐的SQL语句,用咱们熟悉的python代码,就能实现对数据的操作,提高开发效率;
- 可以平滑的操作,切换数据库。
ORM的缺点
- ORM代码转换为SQL语句时,需要花费一定的时间,执行效率会有所降低;
- 长期写ORM代码,导致写SQL语句能力,会有所减弱。
1.2 改进
如果想打印orm转换过程中的sql,需要在settings中进行如下配置:
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console':{
'level':'DEBUG',
'class':'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'propagate': True,
'level':'DEBUG',
},
}
}
settings配置
二 单表操作
django使用MySQL的流程:
2.1 创建MySQL数据库
注意:ORM无法操作到数据库级别,只能操作到数据表。
安装mysql
apt-get install mysql-server mysql-common mysql-client
root@darren-virtual-machine:~# systemctl status mysql
mysql.service - MySQL Community Server
Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
Active: active (running) since Sun 2020-04-05 11:46:45 CST; 58s ago
Main PID: 16219 (mysqld)
Tasks: 27 (limit: 11869)
CGroup: /system.slice/mysql.service
└─16219 /usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/mysqld.pid 4月 05 11:46:44 darren-virtual-machine systemd[1]: Starting MySQL Community Server...
4月 05 11:46:45 darren-virtual-machine systemd[1]: Started MySQL Community Server.
root@darren-virtual-machine:~# mysql -V
mysql Ver 14.14 Distrib 5.7.29, for Linux (x86_64) using EditLine wrapper
root@darren-virtual-machine:~# cat /etc/mysql/debian.cnf
# Automatically generated for Debian scripts. DO NOT TOUCH!
[client]
host = localhost
user = debian-sys-maint
password = gpitUmpta6ImT8hh
socket = /var/run/mysqld/mysqld.sock
[mysql_upgrade]
host = localhost
user = debian-sys-maint
password = gpitUmpta6ImT8hh
socket = /var/run/mysqld/mysqld.sock
可以使用上面的用户名和密码,也可以直接登录
登录mysql
2.2 修改密码
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec) mysql> use mysql;
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> update user set authentication_string=PASSWORD("123456") where user='root';
Query OK, 1 row affected, 1 warning (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 1 mysql> update user set plugin="mysql_native_password";
Query OK, 1 row affected (0.00 sec)
Rows matched: 4 Changed: 1 Warnings: 0 mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec) mysql> quit
2.3 登进数据库建库操作
root@darren-virtual-machine:~# mysql -uroot -p123456
mysql> create database django default charset=utf8;
Query OK, 1 row affected (0.00 sec) mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| django |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
三 创建项目连接数据库
3.1 创建一个新的项目
root@darren-virtual-machine:~# cd /root/PycharmProjects/
root@darren-virtual-machine:~/PycharmProjects# django-admin startproject mystie
root@darren-virtual-machine:~/PycharmProjects# cd mysite/
root@darren-virtual-machine:~/PycharmProjects/mysite# tree ./*
./manage.py [error opening dir]
./mysite
├── asgi.py
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py
3.2 创建一个app应用
root@darren-virtual-machine:~/PycharmProjects/mysite# python3 manage.py startapp app01
root@darren-virtual-machine:~/PycharmProjects/mysite# vim mysite/settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app01.apps.App01Config',
]
3.3 在settings.py里设置数据库连接
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'django',
'HOST': '127.0.0.1',
'PORT': 3306,
'USER': "root",
'PASSWORD': "123456",
}
}
3.4 pymysql操作
root@darren-virtual-machine:~/PycharmProjects/mysite# pip3 install pymysql
Collecting pymysql
Downloading PyMySQL-0.9.3-py2.py3-none-any.whl (47 kB)
|████████████████████████████████| 47 kB 175 kB/s
Installing collected packages: pymysql
Successfully installed pymysql-0.9.3
3.4.1 告诉Django使用pymysql模块连接mysql数据库
root@darren-virtual-machine:~/PycharmProjects/mysite# vim mysite/__init__.py
# 在与settings.py同级目录下的__init__.py中
import pymysql
pymysql.install_as_MySQLdb()
3.4.2 创建模型(在models.py中写类)
[root@node10 pymysql]# cat app01/models.py
from django.db import models # Create your models here.
class Book(models.Model):
title = models.CharField(max_length=32)
author = models.CharField(max_length=32)
publisher = models.CharField(max_length=32)
price = models.DecimalField(max_digits=5, decimal_places=2)
pub_date = models.DateField()
扩展:更多字段和参数
每个字段有一些特有的参数,例如,CharField需要max_length参数来指定VARCHAR
数据库字段的大小。还有一些适用于所有字段的通用参数。 这些参数在文档中有详细定义,这里我们只简单介绍一些最常用的:
更多字段:
<1> CharField
字符串字段, 用于较短的字符串.
CharField 要求必须有一个参数 maxlength, 用于从数据库层和Django校验层限制该字段所允许的最大字符数. <2> IntegerField
#用于保存一个整数. <3> FloatField
一个浮点数. 必须 提供两个参数: 参数 描述
max_digits 总位数(不包括小数点和符号)
decimal_places 小数位数
举例来说, 要保存最大值为 999 (小数点后保存2位),你要这样定义字段: models.FloatField(..., max_digits=5, decimal_places=2)
要保存最大值一百万(小数点后保存10位)的话,你要这样定义: models.FloatField(..., max_digits=19, decimal_places=10)
admin 用一个文本框(<input type="text">)表示该字段保存的数据. <4> AutoField
一个 IntegerField, 添加记录时它会自动增长. 你通常不需要直接使用这个字段;
自定义一个主键:my_id=models.AutoField(primary_key=True)
如果你不指定主键的话,系统会自动添加一个主键字段到你的 model. <5> BooleanField
A true/false field. admin 用 checkbox 来表示此类字段. <6> TextField
一个容量很大的文本字段.
admin 用一个 <textarea> (文本区域)表示该字段数据.(一个多行编辑框). <7> EmailField
一个带有检查Email合法性的 CharField,不接受 maxlength 参数. <8> DateField
一个日期字段. 共有下列额外的可选参数:
Argument 描述
auto_now 当对象被保存时,自动将该字段的值设置为当前时间.通常用于表示 "last-modified" 时间戳.
auto_now_add 当对象首次被创建时,自动将该字段的值设置为当前时间.通常用于表示对象创建时间.
<1> CharField
字符串字段, 用于较短的字符串.
CharField 要求必须有一个参数 maxlength, 用于从数据库层和Django校验层限制该字段所允许的最大字符数. <2> IntegerField
#用于保存一个整数. <3> FloatField
一个浮点数. 必须 提供两个参数: 参数 描述
max_digits 总位数(不包括小数点和符号)
decimal_places 小数位数
举例来说, 要保存最大值为 999 (小数点后保存2位),你要这样定义字段: models.FloatField(..., max_digits=5, decimal_places=2)
要保存最大值一百万(小数点后保存10位)的话,你要这样定义: models.FloatField(..., max_digits=19, decimal_places=10)
admin 用一个文本框(<input type="text">)表示该字段保存的数据. <4> AutoField
一个 IntegerField, 添加记录时它会自动增长. 你通常不需要直接使用这个字段;
自定义一个主键:my_id=models.AutoField(primary_key=True)
如果你不指定主键的话,系统会自动添加一个主键字段到你的 model. <5> BooleanField
A true/false field. admin 用 checkbox 来表示此类字段. <6> TextField
一个容量很大的文本字段.
admin 用一个 <textarea> (文本区域)表示该字段数据.(一个多行编辑框). <7> EmailField
一个带有检查Email合法性的 CharField,不接受 maxlength 参数. <8> DateField
一个日期字段. 共有下列额外的可选参数:
Argument 描述
auto_now 当对象被保存时,自动将该字段的值设置为当前时间.通常用于表示 "last-modified" 时间戳.
auto_now_add 当对象首次被创建时,自动将该字段的值设置为当前时间.通常用于表示对象创建时间.
<14> SlugField
"Slug" 是一个报纸术语. slug 是某个东西的小小标记(短签), 只包含字母,数字,下划线和连字符.#它们通常用于URLs
若你使用 Django 开发版本,你可以指定 maxlength. 若 maxlength 未指定, Django 会使用默认长度: 50. #在
以前的 Django 版本,没有任何办法改变50 这个长度.
这暗示了 db_index=True.
它接受一个额外的参数: prepopulate_from, which is a list of fields from which to auto-#populate
the slug, via JavaScript,in the object's admin form: models.SlugField
(prepopulate_from=("pre_name", "name"))prepopulate_from 不接受 DateTimeFields. <13> XMLField
一个校验值是否为合法XML的 TextField,必须提供参数: schema_path, 它是一个用来校验文本的 RelaxNG schema #的文件系统路径. <14> FilePathField
可选项目为某个特定目录下的文件名. 支持三个特殊的参数, 其中第一个是必须提供的.
参数 描述
path 必需参数. 一个目录的绝对文件系统路径. FilePathField 据此得到可选项目.
Example: "/home/images".
match 可选参数. 一个正则表达式, 作为一个字符串, FilePathField 将使用它过滤文件名.
注意这个正则表达式只会应用到 base filename 而不是
路径全名. Example: "foo.*\.txt^", 将匹配文件 foo23.txt 却不匹配 bar.txt 或 foo23.gif.
recursive可选参数.要么 True 要么 False. 默认值是 False. 是否包括 path 下面的全部子目录.
这三个参数可以同时使用.
match 仅应用于 base filename, 而不是路径全名. 那么,这个例子:
FilePathField(path="/home/images", match="foo.*", recursive=True)
...会匹配 /home/images/foo.gif 而不匹配 /home/images/foo/bar.gif <15> IPAddressField
一个字符串形式的 IP 地址, (i.e. "24.124.1.30").
<16> CommaSeparatedIntegerField
用于存放逗号分隔的整数值. 类似 CharField, 必须要有maxlength参数.
更多字段
更多参数:
(1)null 如果为True,Django 将用NULL 来在数据库中存储空值。 默认值是 False. (1)blank 如果为True,该字段允许不填。默认为False。
要注意,这与 null 不同。null纯粹是数据库范畴的,而 blank 是数据验证范畴的。
如果一个字段的blank=True,表单的验证将允许该字段是空值。如果字段的blank=False,该字段就是必填的。 (2)default 字段的默认值。可以是一个值或者可调用对象。如果可调用 ,每有新对象被创建它都会被调用。 (3)primary_key 如果为True,那么这个字段就是模型的主键。如果你没有指定任何一个字段的primary_key=True,
Django 就会自动添加一个IntegerField字段做为主键,所以除非你想覆盖默认的主键行为,
否则没必要设置任何一个字段的primary_key=True。 (4)unique 如果该值设置为 True, 这个数据字段的值在整张表中必须是唯一的 (5)choices
由二元组组成的一个可迭代对象(例如,列表或元组),用来给字段提供选择项。 如果设置了choices ,默认的表单将是一个选择框而不是标准的文本框,<br>而且这个选择框的选项就是choices 中的选项。
更多参数
3.4.3 执行数据量迁移的命令
root@darren-virtual-machine:~/PycharmProjects/mysite# python3 manage.py makemigrations
报错如下
MySQLclient目前只支持到python3.4,因此如果使用的更高版本的python,需要修改如下:
root@darren-virtual-machine:~/PycharmProjects/mysite# vim /usr/local/lib/python3.6/dist-packages/django/db/backends/mysql/base.py
#if version < (1, 3, 13):
# raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)
注释掉 就OK了。
继续执行
root@darren-virtual-machine:~/PycharmProjects/mysite# python3 manage.py makemigrations
Migrations for 'app01':
app01/migrations/0001_initial.py
- Create model Book
root@darren-virtual-machine:~/PycharmProjects/mysite# ll app01/migrations/
-rw-r--r-- 1 root root 739 4月 5 16:40 0001_initial.py
-rw-r--r-- 1 root root 0 4月 5 14:11 __init__.py
drwxr-xr-x 2 root root 4096 4月 5 16:40 __pycache__/
root@darren-virtual-machine:~/PycharmProjects/mysite# cat app01/migrations/0001_initial.py
# Generated by Django 3.0.5 on 2020-04-05 08:40 from django.db import migrations, models class Migration(migrations.Migration): initial = True dependencies = [
] operations = [
migrations.CreateModel(
name='Book',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=32)),
('author', models.CharField(max_length=32)),
('publisher', models.CharField(max_length=32)),
('price', models.DecimalField(decimal_places=2, max_digits=5)),
('pub_date', models.DateField()),
],
),
]
3.4.4 迁移操作
root@darren-virtual-machine:~/PycharmProjects/mysite# python3 manage.py migrate
Operations to perform:
Apply all migrations: admin, app01, auth, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying app01.0001_initial... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying auth.0010_alter_group_name_max_length... OK
Applying auth.0011_update_proxy_permissions... OK
Applying sessions.0001_initial... OK
查看数据库
mysql> show tables;
+----------------------------+
| Tables_in_django |
+----------------------------+
| app01_book |
| auth_group |
| auth_group_permissions |
| auth_permission |
| auth_user |
| auth_user_groups |
| auth_user_user_permissions |
| django_admin_log |
| django_content_type |
| django_migrations |
| django_session |
+----------------------------+
11 rows in set (0.00 sec) mysql> desc app01_book;
+-----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| title | varchar(32) | NO | | NULL | |
| author | varchar(32) | NO | | NULL | |
| publisher | varchar(32) | NO | | NULL | |
| price | decimal(5,2) | NO | | NULL | |
| pub_date | date | NO | | NULL | |
+-----------+--------------+------+-----+---------+----------------+
四 对数据库的操作
4.1 添加表记录
配置url
root@darren-virtual-machine:~/PycharmProjects/mysite# vim mysite/urls.py
from django.contrib import admin
from django.urls import path,include urlpatterns = [
path('admin/', admin.site.urls),
path('app01/', include("app01.urls")),
]
root@darren-virtual-machine:~/PycharmProjects/mysite# vim app01/urls.py
from django.urls import path,re_path
from app01 import views
urlpatterns = [
path('add_book/', views.add_book),
]
视图文件
root@darren-virtual-machine:~/PycharmProjects/mysite# vim app01/views.py
from django.shortcuts import render,HttpResponse
from app01 import models # Create your views here.
def add_book(request):
if request.method == "GET":
return render(request,"add_book.html")
else:
#方式一:通过类实例化对象的方式。注意:一定要对象.save()
title = request.POST.get("title")
author = request.POST.get("author")
publisher = request.POST.get("publisher")
price = request.POST.get("price")
pub_date = request.POST.get("pub_date")
book_obj = models.Book(title=title,author=author,publisher=publisher,price=price,pub_date=pub_date)
book_obj.save()
return HttpResponse("新增成功")
html模板文件
创建templates目录
root@darren-virtual-machine:~/PycharmProjects/mysite# mkdir templates
注册template
root@darren-virtual-machine:~/PycharmProjects/mysite# vim mysite/settings.py
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR,"templates")],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
root@darren-virtual-machine:~/PycharmProjects/mysite# vim templates/add_book.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h3>新增书籍</h3>
<form action="" method="post">
{% csrf_token %}
<p>书名:<input type="text" name="title"></p>
<p>作者:<input type="text" name="author"></p>
<p>出版社:<input type="text" name="publisher"></p>
<p>价格:<input type="text" name="price"></p>
<p>出版时间:<input type="text" name="pub_date"></p>
<input type="submit">
</form> </body>
</html>
访问http://127.0.0.1:8000/app01/add_book
提交
查看数据库
mysql> select * from app01_book;
+----+-----------+-----------+-----------------+--------+------------+
| id | title | author | publisher | price | pub_date |
+----+-----------+-----------+-----------------+--------+------------+
| 1 | 红楼梦 | 曹雪芹 | 清华出版社 | 165.00 | 2018-12-12 |
+----+-----------+-----------+-----------------+--------+------------+
1 row in set (0.00 sec)
方式二:通过ORM提供的objects提供的方法 create来实现。
root@darren-virtual-machine:~/PycharmProjects/mysite# cat app01/views.py
from django.shortcuts import render,HttpResponse
from app01 import models # Create your views here.
def add_book(request):
if request.method == "GET":
return render(request,"add_book.html")
else:
#方式一:
title = request.POST.get("title")
author = request.POST.get("author")
publisher = request.POST.get("publisher")
price = request.POST.get("price")
pub_date = request.POST.get("pub_date")
#book_obj = models.Book(title=title,author=author,publisher=publisher,price=price,pub_date=pub_date)
#book_obj.save()
#方式二,推荐使用
book_obj = models.Book.objects.create(title=title,author=author,publisher=publisher,price=price,pub_date=pub_date)
访问插入数据http://127.0.0.1:8000/app01/add_book
数据库查看记录
mysql> select * from app01_book;
+----+--------------+-----------+-----------------+--------+------------+
| id | title | author | publisher | price | pub_date |
+----+--------------+-----------+-----------------+--------+------------+
| 1 | 红楼梦 | 曹雪芹 | 清华出版社 | 165.00 | 2018-12-12 |
| 2 | 三国演义 | 罗贯中 | 北大出版社 | 199.00 | 2018-12-23 |
+----+--------------+-----------+-----------------+--------+------------+
4.2 查询操作
4.2.1 查询API
<1> all(): 查询所有结果
<2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象
<3> get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个, 如果符合筛选条件的对象超过一个或者没有都会抛出错误。
<4> exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象
<5> order_by(*field): 对查询结果排序
<6> reverse(): 对查询结果反向排序
<7> count(): 返回数据库中匹配查询(QuerySet)的对象数量。
<8> first(): 返回第一条记录
<9> last(): 返回最后一条记录
<10> exists(): 如果QuerySet包含数据,就返回True,否则返回False
<11> values(*field): 返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列 model的实例化对象,而是一个可迭代的字典序列
<12> values_list(*field): 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
<13> distinct(): 从返回结果中剔除重复纪录
4.2.2 基于双下划线的模糊查询
Book.objects.filter(price__in=[100,200,300])
Book.objects.filter(price__gt=100)
Book.objects.filter(price__lt=100)
Book.objects.filter(price__range=[100,200])
Book.objects.filter(title__contains="法")
Book.objects.filter(title__icontains="python") # 不区分大小写
Book.objects.filter(title__startswith="九")
Book.objects.filter(pub_date__year=2018)
4.2.3 实例
添加测试数据
root@darren-virtual-machine:~/PycharmProjects/mysite# cat app01/views.py
from django.shortcuts import render,HttpResponse
from app01 import models # Create your views here.
def add_book(request):
if request.method == "GET":
return render(request,"add_book.html")
else:
#方式一:
title = request.POST.get("title")
author = request.POST.get("author")
publisher = request.POST.get("publisher")
price = request.POST.get("price")
pub_date = request.POST.get("pub_date")
#book_obj = models.Book(title=title,author=author,publisher=publisher,price=price,pub_date=pub_date)
#book_obj.save()
#方式二,推荐使用
#book_obj = models.Book.objects.create(title=title,author=author,publisher=publisher,price=price,pub_date=pub_date)
#添加数据,添加完成后,及时删除
models.Book.objects.create(title="水浒传",author="施耐庵",price=180, publisher="北电出版社", pub_date="2019-1-12")
models.Book.objects.create(title="西游记",author="吴承恩",price=185, publisher="北大出版社", pub_date="2019-2-12")
models.Book.objects.create(title="独孤九剑", author="风清扬",price = 190, publisher = "华山出版社", pub_date = "2019-1-15")
models.Book.objects.create(title="葵花宝典", author="东方不败", price=120, publisher="黑木崖出版社", pub_date="2019-1-20")
models.Book.objects.create(title="易筋经", author="方丈大师", price=140, publisher="少林出版社", pub_date="2019-1-23")
models.Book.objects.create(title="道德经", author="老子", price=176, publisher="北大出版社", pub_date="2019-2-23")
models.Book.objects.create(title="论语", author="孔子弟子", price=165, publisher="北电出版社", pub_date="2019-2-13")
models.Book.objects.create(title="九阳神功", author="张无忌", price=130, publisher="少林出版社", pub_date="2018-1-23")
models.Book.objects.create(title="九阴真经", author="黄裳", price=145, publisher="大宋出版社", pub_date="2017-3-23")
return HttpResponse("新增成功")
访问http://127.0.0.1:8000/app01/add_book,点击submit
查看数据库
mysql> select * from app01_book;
mysql> select * from app01_book;
+----+--------------+--------------+--------------------+--------+------------+
| id | title | author | publisher | price | pub_date |
+----+--------------+--------------+--------------------+--------+------------+
| 1 | 红楼梦 | 曹雪芹 | 清华出版社 | 165.00 | 2018-12-12 |
| 2 | 三国演义 | 罗贯中 | 北大出版社 | 199.00 | 2018-12-23 |
| 3 | 水浒传 | 施耐庵 | 北电出版社 | 180.00 | 2019-01-12 |
| 4 | 西游记 | 吴承恩 | 北大出版社 | 185.00 | 2019-02-12 |
| 5 | 独孤九剑 | 风清扬 | 华山出版社 | 190.00 | 2019-01-15 |
| 6 | 葵花宝典 | 东方不败 | 黑木崖出版社 | 120.00 | 2019-01-20 |
| 7 | 易筋经 | 方丈大师 | 少林出版社 | 140.00 | 2019-01-23 |
| 8 | 道德经 | 老子 | 北大出版社 | 176.00 | 2019-02-23 |
| 9 | 论语 | 孔子弟子 | 北电出版社 | 165.00 | 2019-02-13 |
| 10 | 九阳神功 | 张无忌 | 少林出版社 | 130.00 | 2018-01-23 |
| 11 | 九阴真经 | 黄裳 | 大宋出版社 | 145.00 | 2017-03-23 |
+----+--------------+--------------+--------------------+--------+------------+
必须恢复views.py,否则会重复添加
编辑路由
root@darren-virtual-machine:~/PycharmProjects/mysite# cat app01/urls.py
from django.urls import path,re_path
from app01 import views
urlpatterns = [
path('add_book/', views.add_book),
path('query_book',views.query_book),
]
定义视图函数
root@darren-virtual-machine:~/PycharmProjects/mysite# cat app01/views.py
from django.shortcuts import render,HttpResponse
from app01 import models # Create your views here.
def add_book(request):
if request.method == "GET":
return render(request,"add_book.html")
else:
#方式一:
title = request.POST.get("title")
author = request.POST.get("author")
publisher = request.POST.get("publisher")
price = request.POST.get("price")
pub_date = request.POST.get("pub_date")
#book_obj = models.Book(title=title,author=author,publisher=publisher,price=price,pub_date=pub_date)
#book_obj.save()
#方式二,推荐使用
book_obj = models.Book.objects.create(title=title,author=author,publisher=publisher,price=price,pub_date=pub_date)
return HttpResponse("新增成功")
def query_book(request):
#all,获取所有结果
books = models.Book.objects.all()
print(books) return HttpResponse("查询成功")
访问http://127.0.0.1:8000/app01/query_book
输出结果
[05/Apr/2020 11:59:21] "GET /app01/add_book/ HTTP/1.1" 200 618
<QuerySet [<Book: Book object (1)>, <Book: Book object (2)>, <Book: Book object (3)>, <Book: Book object (4)>, <Book: Book object (5)>, <Book: Book object (6)>, <Book: Book object (7)>, <Book: Book object (8)>, <Book: Book object (9)>, <Book: Book object (10)>, <Book: Book object (11)>]>
[05/Apr/2020 11:59:26] "GET /app01/query_book HTTP/1.1" 200 12
model返回一个title值
root@darren-virtual-machine:~/PycharmProjects/mysite# cat app01/models.py
from django.db import models # Create your models here.
class Book(models.Model):
title = models.CharField(max_length=32)
author = models.CharField(max_length=32)
publisher = models.CharField(max_length=32)
price = models.DecimalField(max_digits=5, decimal_places=2)
pub_date = models.DateField()
def __str__(self):
return self.title
再次访问查看
[05/Apr/2020 12:04:48] "GET /app01/query_book HTTP/1.1" 200 12
<QuerySet [<Book: 红楼梦>, <Book: 三国演义>, <Book: 水浒传>, <Book: 西游记>, <Book: 独孤九剑>, <Book: 葵花宝典>, <Book: 易筋经>, <Book: 道德经>, <Book: 论语>, <Book: 九阳神功>, <Book: 九阴真经>]>
root@darren-virtual-machine:~/PycharmProjects/mysite# cat app01/views.py
from django.shortcuts import render,HttpResponse
from app01 import models # Create your views here.
def add_book(request):
if request.method == "GET":
return render(request,"add_book.html")
else:
#方式一:
title = request.POST.get("title")
author = request.POST.get("author")
publisher = request.POST.get("publisher")
price = request.POST.get("price")
pub_date = request.POST.get("pub_date")
#book_obj = models.Book(title=title,author=author,publisher=publisher,price=price,pub_date=pub_date)
#book_obj.save()
#方式二,推荐使用
book_obj = models.Book.objects.create(title=title,author=author,publisher=publisher,price=price,pub_date=pub_date)
return HttpResponse("新增成功")
def query_book(request):
#filter Query 对象,类似于列表,获取满足条件的对象,filter可以满足多个条件,之间关系为and
books_filter = models.Book.objects.filter(pk=3)
print(books_filter)
#get,获取对象,没有结果或者有多个结果 会报错
books_get = models.Book.objects.get(pk=3)
print(books_get,type(books_get))
#exclude,query类型,和filter相反,排除满足条件的类型
books_exclude = models.Book.objects.exclude(pk=3)
print(books_exclude)
#order_by默认升序,降序前面添加-即可
books_order_by = models.Book.objects.order_by("price")
print(books_order_by)
books_order_by = models.Book.objects.order_by("-price")
print(books_order_by)
#reverse
books_reverse = models.Book.objects.order_by("-price").reverse()
print(books_reverse)
#first获取第一条
book_first= models.Book.objects.filter(pk=4).first()
print(book_first)
#exist判断结果是否讯在,存在返回true
books_exist = models.Book.objects.exclude(pk=4)
print(books_exist,type(books_exist))
#vaules,QUeryset类型,类似于字典
books_vaules = models.Book.objects.values("title","price")
print(books_vaules,type(books_vaules))
# vaules_list,QUeryset类型,类似于元祖
books_vaules1 = models.Book.objects.values_list("title","price")
print(books_vaules1,type(books_vaules1))
#distinct,去除重复
books = models.Book.objects.values("publisher").distinct()
print(books,type(books)) return HttpResponse("查询成功")
查询结果
<QuerySet [<Book: 水浒传>]>
水浒传 <class 'app01.models.Book'>
<QuerySet [<Book: 红楼梦>, <Book: 三国演义>, <Book: 西游记>, <Book: 独孤九剑>, <Book: 葵花宝典>, <Book: 易筋经>, <Book: 道德经>, <Book: 论语>, <Book: 九阳神功>, <Book: 九阴真经>]>
<QuerySet [<Book: 葵花宝典>, <Book: 九阳神功>, <Book: 易筋经>, <Book: 九阴真经>, <Book: 红楼梦>, <Book: 论语>, <Book: 道德经>, <Book: 水浒传>, <Book: 西游记>, <Book: 独孤九剑>, <Book: 三国演义>]>
<QuerySet [<Book: 三国演义>, <Book: 独孤九剑>, <Book: 西游记>, <Book: 水浒传>, <Book: 道德经>, <Book: 红楼梦>, <Book: 论语>, <Book: 九阴真经>, <Book: 易筋经>, <Book: 九阳神功>, <Book: 葵花宝典>]>
<QuerySet [<Book: 葵花宝典>, <Book: 九阳神功>, <Book: 易筋经>, <Book: 九阴真经>, <Book: 红楼梦>, <Book: 论语>, <Book: 道德经>, <Book: 水浒传>, <Book: 西游记>, <Book: 独孤九剑>, <Book: 三国演义>]>
西游记
<QuerySet [<Book: 红楼梦>, <Book: 三国演义>, <Book: 水浒传>, <Book: 独孤九剑>, <Book: 葵花宝典>, <Book: 易筋经>, <Book: 道德经>, <Book: 论语>, <Book: 九阳神功>, <Book: 九阴真经>]> <class 'django.db.models.query.QuerySet'>
<QuerySet [{'title': '红楼梦', 'price': Decimal('165.00')}, {'title': '三国演义', 'price': Decimal('199.00')}, {'title': '水浒传', 'price': Decimal('180.00')}, {'title': '西游记', 'price': Decimal('185.00')}, {'title': '独孤九剑', 'price': Decimal('190.00')}, {'title': '葵花宝典', 'price': Decimal('120.00')}, {'title': '易筋经', 'price': Decimal('140.00')}, {'title': '道德经', 'price': Decimal('176.00')}, {'title': '论语', 'price': Decimal('165.00')}, {'title': '九阳神功', 'price': Decimal('130.00')}, {'title': '九阴真经', 'price': Decimal('145.00')}]> <class 'django.db.models.query.QuerySet'>
<QuerySet [('红楼梦', Decimal('165.00')), ('三国演义', Decimal('199.00')), ('水浒传', Decimal('180.00')), ('西游记', Decimal('185.00')), ('独孤九剑', Decimal('190.00')), ('葵花宝典', Decimal('120.00')), ('易筋经', Decimal('140.00')), ('道德经', Decimal('176.00')), ('论语', Decimal('165.00')), ('九阳神功', Decimal('130.00')), ('九阴真经', Decimal('145.00'))]> <class 'django.db.models.query.QuerySet'>
<QuerySet [{'publisher': '清华出版社'}, {'publisher': '北大出版社'}, {'publisher': '北电出版社'}, {'publisher': '华山出版社'}, {'publisher': '黑木崖出版社'}, {'publisher': '少林出版社'}, {'publisher': '大宋出版社'}]> <class 'django.db.models.query.QuerySet'>
[05/Apr/2020 12:37:56] "GET /app01/query_book HTTP/1.1" 200 1
4.3 删除记录
删除方法就是 delete()。它运行时立即删除对象而不返回任何值。例如:
model_obj.delete()
你也可以一次性删除多个对象。每个 QuerySet 都有一个 delete() 方法,它一次性删除 QuerySet 中所有的对象。
例如,下面的代码将删除 pub_date 是2018年的 Book 对象:
Book.objects.filter(pub_date__year=2018).delete()
设计url
from django.urls import path,re_path
from app01 import views
urlpatterns = [
path('add_book/', views.add_book), #新增操作
path('query_book/',views.query_book), #查询错做
path('del_book/',views.del_book) #删除操作
]
视图函数
root@darren-virtual-machine:~/PycharmProjects/mysite# cat app01/views.py
from django.shortcuts import render,HttpResponse
from app01 import models # Create your views here.
def add_book(request):
if request.method == "GET":
return render(request,"add_book.html")
else:
#方式一:
title = request.POST.get("title")
author = request.POST.get("author")
publisher = request.POST.get("publisher")
price = request.POST.get("price")
pub_date = request.POST.get("pub_date")
#book_obj = models.Book(title=title,author=author,publisher=publisher,price=price,pub_date=pub_date)
#book_obj.save()
#方式二,推荐使用
book_obj = models.Book.objects.create(title=title,author=author,publisher=publisher,price=price,pub_date=pub_date)
return HttpResponse("新增成功")
def query_book(request):
#基于双线划线的模糊查询
books = models.Book.objects.filter(price_in=[120,160,150])
print(books)
books = models.Book.objects.filter(price_range=[120, 160])
print(books) return HttpResponse("查询成功") def del_book(request):
pk = request.GET.get('pk')
print(pk)
#方式一使用对象的形式删除
book_obj = models.Book.objects.filter(pk=pk).first()
book_obj.delete()
return HttpResponse("删除成功")
访问http://127.0.0.1:8000/app01/del_book/?pk=3
查看数据库
mysql> select * from app01_book;
+----+--------------+--------------+--------------------+--------+------------+
| id | title | author | publisher | price | pub_date |
+----+--------------+--------------+--------------------+--------+------------+
| 1 | 红楼梦 | 曹雪芹 | 清华出版社 | 165.00 | 2018-12-12 |
| 2 | 三国演义 | 罗贯中 | 北大出版社 | 199.00 | 2018-12-23 |
| 4 | 西游记 | 吴承恩 | 北大出版社 | 185.00 | 2019-02-12 |
| 5 | 独孤九剑 | 风清扬 | 华山出版社 | 190.00 | 2019-01-15 |
| 6 | 葵花宝典 | 东方不败 | 黑木崖出版社 | 120.00 | 2019-01-20 |
| 7 | 易筋经 | 方丈大师 | 少林出版社 | 140.00 | 2019-01-23 |
| 8 | 道德经 | 老子 | 北大出版社 | 176.00 | 2019-02-23 |
| 9 | 论语 | 孔子弟子 | 北电出版社 | 165.00 | 2019-02-13 |
| 10 | 九阳神功 | 张无忌 | 少林出版社 | 130.00 | 2018-01-23 |
| 11 | 九阴真经 | 黄裳 | 大宋出版社 | 145.00 | 2017-03-23 |
+----+--------------+--------------+--------------------+--------+------------+
方法二
视图函数
root@darren-virtual-machine:~/PycharmProjects/mysite# cat app01/views.py
。。。。。。 def del_book(request):
pk = request.GET.get('pk')
print(pk)
#方式一使用对象的形式删除
#book_obj = models.Book.objects.filter(pk=pk).first()
#book_obj.delete()
#方式二
books = models.Book.objects.filter(pk=pk).delete() #返回值是受影响的行数
print(books)
return HttpResponse("删除成功"
在 Django 删除对象时,会模仿 SQL 约束 ON DELETE CASCADE 的行为,换句话说,删除一个对象时也会删除与它相关联的外键对象。例如:
b = Book.objects.get(pk=1)
# This will delete the Blog and all of its Entry objects.
b.delete()
要注意的是: delete() 方法是 QuerySet 上的方法,但并不适用于 Manager 本身。这是一种保护机制,是为了避免意外地调用 Entry.objects.delete() 方法导致 所有的 记录被误删除。如果你确认要删除所有的对象,那么你必须显式地调用:
Book.objects.all().delete()
访问http://127.0.0.1:8000/app01/del_book/?pk=4
mysql> select * from app01_book;
+----+--------------+--------------+--------------------+--------+------------+
| id | title | author | publisher | price | pub_date |
+----+--------------+--------------+--------------------+--------+------------+
| 1 | 红楼梦 | 曹雪芹 | 清华出版社 | 165.00 | 2018-12-12 |
| 2 | 三国演义 | 罗贯中 | 北大出版社 | 199.00 | 2018-12-23 |
| 5 | 独孤九剑 | 风清扬 | 华山出版社 | 190.00 | 2019-01-15 |
| 6 | 葵花宝典 | 东方不败 | 黑木崖出版社 | 120.00 | 2019-01-20 |
| 7 | 易筋经 | 方丈大师 | 少林出版社 | 140.00 | 2019-01-23 |
| 8 | 道德经 | 老子 | 北大出版社 | 176.00 | 2019-02-23 |
| 9 | 论语 | 孔子弟子 | 北电出版社 | 165.00 | 2019-02-13 |
| 10 | 九阳神功 | 张无忌 | 少林出版社 | 130.00 | 2018-01-23 |
| 11 | 九阴真经 | 黄裳 | 大宋出版社 | 145.00 | 2017-03-23 |
+----+--------------+--------------+--------------------+--------+------------+
调试输出
4
(1, {'app01.Book': 1})
[05/Apr/2020 13:26:15] "GET /app01/del_book/?pk=4 HTTP/1.1" 200 12
4.4 修改表记录
设计url
from django.urls import path,re_path
from app01 import views
urlpatterns = [
path('add_book/', views.add_book), #新增操作
path('query_book/',views.query_book), #查询错做
path('del_book/',views.del_book), #删除操作
path('edit_book/',views.edit_book), #编辑操作
]
视图函数
from django.shortcuts import render,HttpResponse
from app01 import models # Create your views here.
def add_book(request):
if request.method == "GET":
return render(request,"add_book.html")
else:
#方式一:
title = request.POST.get("title")
author = request.POST.get("author")
publisher = request.POST.get("publisher")
price = request.POST.get("price")
pub_date = request.POST.get("pub_date")
#book_obj = models.Book(title=title,author=author,publisher=publisher,price=price,pub_date=pub_date)
#book_obj.save()
#方式二,推荐使用
book_obj = models.Book.objects.create(title=title,author=author,publisher=publisher,price=price,pub_date=pub_date)
return HttpResponse("新增成功")
def query_book(request):
#基于双线划线的模糊查询
books = models.Book.objects.filter(price_in=[120,160,150])
print(books)
books = models.Book.objects.filter(price_range=[120, 160])
print(books) return HttpResponse("查询成功") def del_book(request):
pk = request.GET.get('pk')
print(pk)
#方式一使用对象的形式删除
#book_obj = models.Book.objects.filter(pk=pk).first()
#book_obj.delete()
#方式二
books = models.Book.objects.filter(pk=pk).delete()
print(books)
return HttpResponse("删除成功") def edit_book(request):
pk = request.GET.get("pk")
if request.method == "GET":
book_obj = models.Book.objects.filter(pk=pk).first()
return render(request,"edit_book.html",{"book_obj":book_obj})
html模板文件
root@darren-virtual-machine:~/PycharmProjects/mysite# cat templates/edit_book.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h3>编辑数据</h3> <form action="" method="post">
{% csrf_token %}
<p>书名:<input type="text" name="title" value="{{ book_obj.title }}"></p>
<p>作者:<input type="text" name="author" value="{{ book_obj.author }}"></p>
<p>出版社:<input type="text" name="publisher" value="{{ book_obj.publisher }}"></p>
<p>价格:<input type="text" name="price" value="{{ book_obj.price }}"></p>
<p>出版时间:<input type="text" name="pub_date" value="{{ book_obj.pub_date|date:"Y-m-d" }}"></p>
<input type="submit">
</form> </body>
</html>
访问http://127.0.0.1:8000/app01/edit_book/?pk=5
修改显示时间
<form action="" method="post">
{% csrf_token %}
<p>书名:<input type="text" name="title" value="{{ book_obj.title }}"></p>
<p>作者:<input type="text" name="author" value="{{ book_obj.author }}"></p>
<p>出版社:<input type="text" name="publisher" value="{{ book_obj.publisher }}"></p>
<p>价格:<input type="text" name="price" value="{{ book_obj.price }}"></p>
<p>出版时间:<input type="text" name="pub_date" value="{{ book_obj.pub_date|date:"Y-m-d" }}"></p>
<input type="submit">
</form>
刷新
编辑操作
方式一:
通过修改实例对象的属性方式。注意:一定要对象.save()
def edit_book(request):
pk = request.GET.get("pk")
if request.method == "GET":
book_obj = models.Book.objects.filter(pk=pk).first()
return render(request,"edit_book.html",{"book_obj":book_obj})
else:
#方式一:
title = request.POST.get("title")
author = request.POST.get("author")
publisher = request.POST.get("publisher")
price = request.POST.get("price")
pub_date = request.POST.get("pub_date")
book_obj = models.Book.objects.filter(pk=pk).first()
book_obj.price = price
book_obj.save()
return HttpResponse("编辑成功")
访问http://127.0.0.1:8000/app01/edit_book/?pk=5并修改
数据库查询
+----+--------------+--------------+--------------------+--------+------------+
| id | title | author | publisher | price | pub_date |
+----+--------------+--------------+--------------------+--------+------------+
| 1 | 红楼梦 | 曹雪芹 | 清华出版社 | 165.00 | 2018-12-12 |
| 2 | 三国演义 | 罗贯中 | 北大出版社 | 199.00 | 2018-12-23 |
| 5 | 独孤九剑 | 风清扬 | 华山出版社 | 143.00 | 2019-01-15 |
| 6 | 葵花宝典 | 东方不败 | 黑木崖出版社 | 120.00 | 2019-01-20 |
| 7 | 易筋经 | 方丈大师 | 少林出版社 | 140.00 | 2019-01-23 |
| 8 | 道德经 | 老子 | 北大出版社 | 176.00 | 2019-02-23 |
| 9 | 论语 | 孔子弟子 | 北电出版社 | 165.00 | 2019-02-13 |
| 10 | 九阳神功 | 张无忌 | 少林出版社 | 130.00 | 2018-01-23 |
| 11 | 九阴真经 | 黄裳 | 大宋出版社 | 145.00 | 2017-03-23 |
+----+--------------+--------------+--------------------+--------+------------+
方式二:
通过ORM提供的objects提供的方法 update来实现。
from django.shortcuts import render,HttpResponse
from app01 import models # Create your views here.
def add_book(request):
if request.method == "GET":
return render(request,"add_book.html")
else:
#方式一:
title = request.POST.get("title")
author = request.POST.get("author")
publisher = request.POST.get("publisher")
price = request.POST.get("price")
pub_date = request.POST.get("pub_date")
#book_obj = models.Book(title=title,author=author,publisher=publisher,price=price,pub_date=pub_date)
#book_obj.save()
#方式二,推荐使用
book_obj = models.Book.objects.create(title=title,author=author,publisher=publisher,price=price,pub_date=pub_date)
return HttpResponse("新增成功")
def query_book(request):
#基于双线划线的模糊查询
books = models.Book.objects.filter(price_in=[120,160,150])
print(books)
books = models.Book.objects.filter(price_range=[120, 160])
print(books) return HttpResponse("查询成功") def del_book(request):
pk = request.GET.get('pk')
print(pk)
#方式一使用对象的形式删除
#book_obj = models.Book.objects.filter(pk=pk).first()
#book_obj.delete()
#方式二
books = models.Book.objects.filter(pk=pk).delete()
print(books)
return HttpResponse("删除成功") def edit_book(request):
pk = request.GET.get("pk")
if request.method == "GET":
book_obj = models.Book.objects.filter(pk=pk).first()
return render(request,"edit_book.html",{"book_obj":book_obj})
else:
#方式二:
title = request.POST.get("title")
author = request.POST.get("author")
publisher = request.POST.get("publisher")
price = request.POST.get("price")
pub_date = request.POST.get("pub_date")
books = models.Book.objects.filter(pk=pk).update(price=price) #返回影响事物的行数
print(books)
return HttpResponse("编辑成功")
此外,update()方法对于任何结果集(QuerySet)均有效,这意味着你可以同时更新多条记录update()方法会返回一个整型数值,表示受影响的记录条数。
访问 http://127.0.0.1:8000/app01/edit_book/?pk=6并修改
查看数据库
mysql> select * from app01_book;
+----+--------------+--------------+--------------------+--------+------------+
| id | title | author | publisher | price | pub_date |
+----+--------------+--------------+--------------------+--------+------------+
| 1 | 红楼梦 | 曹雪芹 | 清华出版社 | 165.00 | 2018-12-12 |
| 2 | 三国演义 | 罗贯中 | 北大出版社 | 199.00 | 2018-12-23 |
| 5 | 独孤九剑 | 风清扬 | 华山出版社 | 143.00 | 2019-01-15 |
| 6 | 葵花宝典 | 东方不败 | 黑木崖出版社 | 179.00 | 2019-01-20 |
| 7 | 易筋经 | 方丈大师 | 少林出版社 | 140.00 | 2019-01-23 |
| 8 | 道德经 | 老子 | 北大出版社 | 176.00 | 2019-02-23 |
| 9 | 论语 | 孔子弟子 | 北电出版社 | 165.00 | 2019-02-13 |
| 10 | 九阳神功 | 张无忌 | 少林出版社 | 130.00 | 2018-01-23 |
| 11 | 九阴真经 | 黄裳 | 大宋出版社 | 145.00 | 2017-03-23 |
+----+--------------+--------------+--------------------+--------+------------+
编辑成功
055.Python前端Django模型ORM的更多相关文章
- 057.Python前端Django模型ORM多表查询
一 基于对象的查询 1.1 一对多查询 设计路由 from django.contrib import admin from django.urls import path from app01 im ...
- 056.Python前端Django模型ORM多表基本操作
一 准备工作 1.1 新建一个项目 root@darren-virtual-machine:~# cd /root/PycharmProjects/ root@darren-virtual-machi ...
- 【Python】django模型models的外键关联使用
Python 2.7.10,django 1.8.6 外键关联:http://www.bubuko.com/infodetail-618303.html 字段属性:http://www.cnblogs ...
- Python学习---django之ORM的增删改查180125
模型常用的字段类型参数 <1> CharField #字符串字段, 用于较短的字符串. #CharField 要求必须有一个参数 maxlength, 用于从数 ...
- Python学习---django之ORM语法[对象关系映射]180124
ORM语法[对象关系映射] ORM: 用面向对象的方式去操作数据库的创建表以及增删改查等操作. 优点:1 ORM使得我们的通用数据库交互变得简单易行,而且完全不用考虑该死的SQL语句.快速开发. 2 ...
- Django 模型ORM
from django.db import models # Create your models here. class Book(models.Model): nid = models.AutoF ...
- python 之 Django框架(ORM常用字段和字段参数、关系字段和和字段参数)
12.324 Django ORM常用字段 .id = models.AutoField(primary_key=True):int自增列,必须填入参数 primary_key=True.当model ...
- python 之 Django框架(orm单表查询、orm多表查询、聚合查询、分组查询、F查询、 Q查询、事务、Django ORM执行原生SQL)
12.329 orm单表查询 import os if __name__ == '__main__': # 指定当前py脚本需要加载的Django项目配置信息 os.environ.setdefaul ...
- 063.Python前端Django分页器
Django的分页器 1 前期准备 创建一个数据库,用于存放数据 mysql> create database pager default charset=utf8; mysql> use ...
随机推荐
- CMD控制台(命令提示符)的打开方式
打开CMD的方式 打开+系统+命令提示符 Win键 +R 输入cmd 打开控制台(推荐使用) 在任意的文件夹下面,按住shift键+鼠标右键点击+在此处打开命令行窗口 资源管理器的地址栏前面加上cmd ...
- BBR拥塞算法的简单解释
TCP BBR的ACM论文中,开篇就引入了图1,以此来说明BBR算法的切入点: 为何当前基于丢包探测的TCP拥塞控制算法还有优化空间? BBR算法的优化极限在哪儿? 图1 为了理解这张图花了我整整一个 ...
- Vue3.0中引入地图(谷歌+高德+腾讯+百度)
1 概述 项目需求需要引入地图,对于目前最新的Vue3.0,无论是百度/高德/腾讯地图目前还没有适配,只有Vue 2.x版本的: 目前只有谷歌地图的Vue3.0适配: 但是没有适配并不代表不能使用,本 ...
- Java基础练习——读心术(扑克牌魔术——21张扑克牌)
Java基础练习--读心术(扑克牌魔术--21张扑克牌) 用到了Scanner,for循环,if-else语句,集合,线程的Thread.sleep()方法 话不多说,直接上代码!
- 2021 DevOpsDays 东京站完美收官 | CODING 专家受邀分享最新技术资讯
DevOpsDays 是一个全球知名的系列技术会议品牌,内容涵盖了软件开发.自动化.测试.安全.组织文化以及 IT 运营的社区会议等.DevOpsDays 由 DevOps 之父 Patrick De ...
- 【Azure Developer】使用Java SDK代码创建Azure VM (包含设置NSG,及添加数据磁盘SSD)
在参考Azure官方文档进行VM创建时,发现其中没有包含如何设置NSG的内容,以及如何在创建时就添加数据磁盘的代码(设置磁盘为SSD类型).本文的内容以"使用 Java 创建和管理 Azur ...
- Vue 批量注册局部组件及应用
博客地址:https://ainyi.com/105 批量注册路由的有个博客说到:https://ainyi.com/77 实际工作中,可能会遇到一个大页面里面有很多个模块,这些模块一般是需要拆分到单 ...
- 1040 Longest Symmetric String
Given a string, you are supposed to output the length of the longest symmetric sub-string. For examp ...
- 反病毒攻防研究第004篇:利用WinRAR与AutoRun.inf实现自启动
一.前言 由之前的一系列研究可以发现,为了使得"病毒"能够实现自启动,我也是煞费苦心,采取了各种方式,往往需要编写冗长的代码并且还需要掌握系统底层或注册表的很多知识才可以.而这次我 ...
- 【转】如何用MTR诊断网络问题
MTR 是一个强大的网络诊断工具,管理员能够用它诊断和隔离网络错误,并向上游提供商提供有关网络状态的有用报告.MTR 通过更大的采样来跟踪路由,就像 traceroute + ping 命令的组合.本 ...