用 Django 管理数据库
1. 用 Django 管理数据库
本模板是基于Django访问MySQL数据库,Django 的数据库接口非常好用,我们甚至不需要知道SQL语句如何书写,就可以轻松地查询,创建一些内容,所以有时候想,在其它的地方使用Django的 ORM呢?它有这么丰富的 QuerySet API.
2. 环境要求:
-
首先需安装 Python 3.5.2 版本,建议安装: Anaconda3-4.1.1-Windows-x86_64 ,自带 Python 3.5.2。
-
数据库采用流行的 MySQL 数据库,请自行安装,我采用远程服务器, setting 文件配置如下:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'cis_lib', 'USER': 'admin', 'PASSWORD': '123456', 'HOST': 'SERVERS1', 'PORT': '3306', }, }
-
由于采用了 MySQL 数据库,因此需要安装 pymysql :
pip install pymysql 我安装的版本为:PyMySQL (0.9.2)
并需要在Django工程目录下**__init__.py**文件中增加以下两句话:
import pymysql pymysql.install_as_MySQLdb()
这一步暂时保留,因为模板中没有加入也可以正常使用。
-
最后安装 Django2.1 版本:
pip install django==2.1
以下命令测试是否安装成功:
import django print(django.get_version()) 输出 2.1 表示 2.1 版本安装成功
3. 基本命令:
-
新建一个 django project
django-admin.py startproject [project_name] 如果报错,尝试用 django-admin startproject [project_name] 试试
-
新建 APP,cd [project_name] 然后执行下面的命令
python manage.py startapp [app_name] 或 django-admin.py startapp [app_name]
-
创建数据库表 或 更改数据库表或字段
1. 创建更改的文件 python manage.py makemigrations 2. 将生成的py文件应用到数据库 python manage.py migrate
-
启动开发服务器
python manage.py runserver 当提示端口被占用的时候,可以用其它端口: python manage.py runserver 8001 python manage.py runserver 9999 (当然也可以kill掉占用端口的进程,具体后面有讲,此处想知道的同学可查下 lsof 命令用法) 监听机器所有可用 ip (电脑可能有多个内网ip或多个外网ip) python manage.py runserver 0.0.0.0:8000 如果是外网或者局域网电脑上可以用其它电脑查看开发服务器 访问对应的 ip加端口,比如 http://172.16.20.2:8000
-
清空数据库
python manage.py flush
-
创建超级管理员
python manage.py createsuperuser 按照提示输入用户名和对应的密码就好了邮箱可以留空,用户名和密码必填
-
修改用户密码:
python manage.py changepassword [username]
-
导出数据 导入数据
python manage.py dumpdata appname > appname.json python manage.py loaddata appname.json
-
Django终端
python manage.py shell
-
数据库命令行
python manage.py dbshell
-
查看命令列表
python manage.py
这里我们主要使用的命令有:
1. 创建更改的文件
python manage.py makemigrations
2. 将生成的py文件应用到数据库
python manage.py migrate
4. Django模块属性与方法
django.urls
reverse
reverse 接收 url 中的 name 作为第一个参数,我们在代码中就可以通过 reverse() 来获取对应的网址(这个网址可以用来跳转,也可以用来计算相关页面的地址),只要对应的 url 的name不改,就不用改代码中的网址。python引用举例:
from django.urls import reverse
reverse('add1', args=(4,5))
u'/add/4/5/'
reverse('add2', args=(444,555))
u'/add/444/555/'
url 写法:
urlpatterns = [
path('add/<a>/<b>/', clac1_views.add, name='add1'),
]
path
path函数定义
path(route, view, kwargs=None, name=None)
例子
from django.urls import path
urlpatterns = [
path('', learn_views.index, name = 'learn'),
path('add/<a>/<b>/', clac1_views.add, name='add1'),
]
name参数是为这个路由起的名字,可以用 django.url.reverse 函数或者 在html中直接调用,
下面举例说明在html中的引用方法:
<a href="/add/4/5/"> |penguin 计算 4+5| </a>
不带参数引用格式: {% url 'name' %},name表示路由名称。
<a href="{% url 'learn' %}"> |学习| </a>
带参数引用格式: {% url 'name' 参数1 参数2 %} ,多个参数用空格隔开
<a href="{% url 'add1' 12 100 %}"> |计算 12 + 100| </a>
html执行结果:
|penguin 计算 4+5| |学习| |计算 12 + 100|
在html中点击相应的标签,就可以进行进行对应计算或跳转到对应地址。
django.shortcuts
render
网页渲染,使用举例:
render(request, 'home.html', {'string001':'我是中国人'})
渲染 home.html,并向网页传递 string001 参数。
在网页代码body的起始位置中加入 {{string001}} 获取引用,结果如下:
我是中国人 |penguin 计算 4+5| |学习| |计算 12 + 100|
在网页中用for循环,显示传入的列表:
def index(request):
tlist = ["HTML", "CSS", "jQuery", "Python", "Django"]
return render(request, 'home.html', {'string001': "I'm chinese !", 'l': tlist})
网页代码:
{{string001}}
{% for i in l %}
{{ i }}
{% endfor %}
结果: I’m chinese ! HTML CSS jQuery Python Django
举一反三:也可以进行传递字典参数,遍历字典等等。
5. Django数据库操作
创建数据库对象
数据库操作前,首先需要在 app 中 的 models.py 文件中创建数据库对象:
from django.db import models
# 在数据库增加一个表,表名为: [app名]_[类名]
class Person(models.Model):
# Person 类的属性 name 和 age 作为表头,并自动增加 id 表头。
# CharField表示字符串,max_length=30表示数据长度<=30,即:varchar(30)
name = models.CharField(max_length=30)
# IntegerField表示int型数据
age = models.IntegerField()
然后输入下列命令,同步数据库
1. 创建更改的文件
python manage.py makemigrations
2. 将生成的py文件应用到数据库
python manage.py migrate
写数据库的几种方法
#导入类
from index.models import Person
方法1:
s = Person()
s.name = 'jj'
s.age = 88
s.save()
方法2:
s = Person(name='jk',age=200)
s.save()
方法3:
Person.objects.create(name=name,age=age)
这种方法可避免重复写入,但是速度要相对慢些,返回一个元组,第一个为Person对象,第二个为True或False, 若已经存在相同数据时返回False.
读数据库的几种方法
方法1:
# 获取所有内容
ps = Person.objects.all()
# 获取前10个内容
ps = Person.objects.all()[:10]
#可以通过 ps[序号].name 属性类获取name
#可以通过 ps[序号].age 属性类获取age
方法2:
# 获取name为'WZT'的内容
p = Person.objects.get(name='WZT')
# 获取id为5的内容
p = Person.objects.get(id=5)
#可以通过 p.name 属性类获取name
#可以通过 p.age 属性类获取age
条件读取:
Person.objects.filter(name="abc") # 等于Person.objects.filter(name__exact="abc") 名称严格等于 "abc" 的人
Person.objects.filter(name__iexact="abc") # 名称为 abc 但是不区分大小写,可以找到 ABC, Abc, aBC,这些都符合条件
Person.objects.filter(name__contains="abc") # 名称中包含 "abc"的人
Person.objects.filter(name__icontains="abc") #名称中包含 "abc",且abc不区分大小写
Person.objects.filter(name__regex="^abc") # 正则表达式查询
Person.objects.filter(name__iregex="^abc") # 正则表达式不区分大小写
条件排除读取:
filter是找出满足条件的,当然也有排除符合某条件的
Person.objects.exclude(name__contains="WZ") # 排除包含 WZ 的Person对象
Person.objects.filter(name__contains="abc").exclude(age=23) # 找出名称含有abc, 但是排除年龄是23岁的
6. 使用方法
将该文件夹直接作为工程模板,文件说明:
main.py 文件为程序主入口文件。
manage.py 必备文件,用来支持数据库融合等命令
settings.py 配置文件
Entity为应用文件夹,其下的 migrations 文件夹必须存在,否则无法创建数据库表
models.py 为数据库接口
models.py
在本文件中创建的每个继承models.Model的类,都相当于在数据库中的一个表
#构造ORM的对象
class Animal_json(models.Model):
name = models.CharField(db_column=u'name', max_length=255, primary_key=True)
data_json = models.TextField(db_column=u'data_json')
def __unicode__(self):
return 'animal_json'
class Meta:
db_table = 'animal_json'
其中的属性name 、data_json分别表示两个表头
manage.py
在修改了数据库模型的时候,可运行以下命令与数据库进行融合:
1. 创建更改的文件
python manage.py makemigrations
2. 将生成的py文件应用到数据库
python manage.py migrate
如出现意外,可尝试删除数据库中的所有表,并删除Entity\migrations目录下的所有文件进行修复。
settings.py
主要存放数据库的配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'tt', #数据库的名称注意修改
'USER': 'admin',
'PASSWORD': '123456',
'HOST': 'SERVERS1',
'PORT': '3306',
},
}
main.py
主应用程序