前言
Django作为重量级的Python web框架,在做项目时肯定少不了与数据库打交道,编程人员对数据库的语法简单的还行,但过多的数据库语句不是编程人员的重点对象。因此用ORM来操作数据库相当快捷。今天来介绍一下用ORM操作数据库。
一、创建Django项目
可以使用pycharme专业版直接快速创建。如果不是专业版也可以使用命令进行创建。下面列出命令行创建方式:
1
|
django-admin startproject orm_test
|
这时会在当前目录创建文件夹名为orm_test,接下来进入orm_test文件夹中,执行命令:
1
|
python manage.py runserver
|
就启动了该项目,默认浏览器访问127.0.0.1:8000就可以看到项目运行成功的提示。
接下来我们用命令在项目中创建一个应用:
1
|
django-admin startapp cmdb
|
此时基本准备就做好了。
二、修改配置文件
把我们的应用即cmdb添加到 setting.py 的 INSTALLED_APPS 中:
1
2
3
4
5
6
7
8
9
|
INSTALLED_APPS = [
'django.contrib.admin' ,
'django.contrib.auth' ,
'django.contrib.contenttypes' ,
'django.contrib.sessions' ,
'django.contrib.messages' ,
'django.contrib.staticfiles' ,
'cmdb' , #我们创建的应用
]
|
另外我们基本用的是mysql数据库,但django中默认为sqlite3。仍然在setting.py中找到 DATABASES ,对内容进行修改:
1
2
3
4
5
6
7
8
9
10
|
DATABASES = {
'default' : {
'ENGINE' : 'django.db.backends.mysql' ,
'NAME' : 'orm_test' , #数据库名称
'USER' : 'root' , #用户
'PASSWORD' : '123456' , #密码
'HOST' : 'localhost' , #IP地址,本地测试为localhost
'PORT' : '3306' , #端口号
}
}
|
里面的“NAME”的值是你数据库中已有的数据库名称,接下里在此数据库中创建数据表。
在python3 中,连接数据库的是pymysql,因此在项目同名文件夹下的__init__.py 中加入以下代码才能正常运行。
1
2
|
import pymysql
pymysql.install_as_MySQLdb()
|
三、写模板文件来创建表结构
在应用(cmdb)的 models.py 中开始写表结构,我们要做的就是写一个类,类中的属性为表中的列,ORM将类转换为sql语句。简单的写一个下面的类,包含用户名和密码两列。
1
2
3
4
5
6
7
|
from django.db import models
# Create your models here.
class users(models.Model):
username = models.CharField(max_length = 32 )
password = models.CharField(max_length = 64 )
|
四、生成数据表
在终端中输入命令行 python manage.py makemigrations ,这时会在应用(cmdb)下的migrations文件夹下出现一个_initial.py 的文件,它记录着生成数据表结构的一些数据的临时文件,接着在命令行中输入 python manage.py migrate,由刚才的临时文件生成数据表。我们在数据库中查看生成的数据表,可以看到django生成的不仅仅是刚创建的一个表,而是十多个表,除自己的一张表,剩余为django内部使用(包含有缓存,cookie,session等,毕竟这么厉害的框架为你做到你想不到的是应该的)。在终端中查看一下表结构:show create table cmdb_users;
看到的不仅有两个自定的属性列,多出一个id列,并且是自增的还是主键。
五、路由映射关系
在同名项目文件夹下的urls.py 中导入应用(cmdb),写映射关系到cmdb的views.py
1
2
3
4
5
6
7
|
from django.conf.urls import url
from django.contrib import admin
from cmdb import views
urlpatterns = [
url(r '^admin/' , admin.site.urls),
url(r '^login/' , views.login),
]
|
六、视图及数据表的增删改查
在路由映射到应用(cmdb)下的views.py 中,右映射中写对应的函数,也就是login函数。用于显示的观察项目的运行,我们在此函数中就先简单得的打印到屏幕上一句“Hello World”。
在login函数中写入增删改查的语句。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
from django.shortcuts import render
from django.shortcuts import HttpResponse
# Create your views here.
from cmdb import models
def login(request):
#增加
# models.users.objects.create(username='xsmile',password=12345)
# models.users.objects.create(username='sofia',password=12345)
# models.users.objects.create(username='jerry',password=12345)
#查看
# result=models.users.objects.all() #查看所有
# 条件查询,结果为querySet类型,所以循环取出结果
# result=models.users.objects.filter(username='sofia')
# for row in result:
# print(row.id,row.username,row.password)
#更改
# models.users.objects.filter(id=2).update(username='eric')
#删除
#models.users.objects.filter(username='sofia').delete()
return HttpResponse( 'Hello World' )
|
启动项目后,浏览器访问127.0.0.1:8000/login 就可看到屏幕上的Hello World,表示相关的数据操作已成功修改数据表。
相关操作后数据表内容的变化如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
#插入一条数据后
mysql> select * from cmdb_users;
+ ----+----------+----------+
| id | username | password |
+ ----+----------+----------+
| 1 | xsmile | 12345 |
+ ----+----------+----------+
1 row in set (0.00 sec)
#再插入三条数据后
mysql> select * from cmdb_users;
+ ----+----------+----------+
| id | username | password |
+ ----+----------+----------+
| 1 | xsmile | 12345 |
| 2 | xsmile | 12345 |
| 3 | sofia | 12345 |
| 4 | jerry | 12345 |
+ ----+----------+----------+
4 rows in set (0.00 sec)
#修改数据后
mysql> select * from cmdb_users;
+ ----+----------+----------+
| id | username | password |
+ ----+----------+----------+
| 1 | xsmile | 12345 |
| 2 | eric | 12345 |
| 3 | sofia | 12345 |
| 4 | jerry | 12345 |
+ ----+----------+----------+
4 rows in set (0.00 sec)
#删除数据后
mysql> select * from cmdb_users;
+ ----+----------+----------+
| id | username | password |
+ ----+----------+----------+
| 1 | xsmile | 12345 |
| 2 | eric | 12345 |
| 4 | jerry | 12345 |
+ ----+----------+----------+
3 rows in set (0.00 sec)
|
七、django orm 常用查询筛选
先列举一下django orm中的常用查询的筛选方法:
- 大于、大于等于
- 小于、小于等于
- in
- like
- is null / is not null
- 不等于/不包含于
model:
1
2
3
4
5
6
7
8
|
class User(AbstractBaseUser, PermissionsMixin):
uuid = ShortUUIDField(unique = True )
username = models.CharField(max_length = 100 , db_index = True , unique = True , default = '')
schoolid = models.CharField(max_length = 100 , null = True , blank = True , default = '')
classid = models.CharField(max_length = 100 , null = True , blank = True , default = '')
fullname = models.CharField(max_length = 50 , default = '', null = True , blank = True )
email = models.EmailField(_( 'email address' ), blank = True , null = True )
age = models.SmallIntegerField(default = 0 )
|
大于、大于等于
1
2
3
4
5
|
__gt 大于
__gte 大于等于
User.objects. filter (age__gt = 10 ) / / 查询年龄大于 10 岁的用户
User.objects. filter (age__gte = 10 ) / / 查询年龄大于等于 10 岁的用户
|
小于、小于等于
1
2
3
4
5
|
__lt 小于
__lte 小于等于
User.objects. filter (age__lt = 10 ) / / 查询年龄小于 10 岁的用户
User.objects. filter (age__lte = 10 ) / / 查询年龄小于等于 10 岁的用户
|
in
1
2
3
4
|
__in
查询年龄在某一范围的用户
User.objects. filter (age__in = [ 10 , 20 , 30 ])
|
like
1
2
3
4
|
__exact 精确等于 like 'aaa'
__iexact 精确等于 忽略大小写 ilike 'aaa'
__contains 包含 like '%aaa%'
__icontains 包含 忽略大小写 ilike '%aaa%',但是对于sqlite来说,contains的作用效果等同于icontains。
|
is null / is not null
1
2
3
4
|
__isnull 判空
User.objects. filter (username__isnull = True ) / / 查询用户名为空的用户
User.objects. filter (username__isnull = False ) / / 查询用户名不为空的用户
|
不等于/不包含于
1
2
|
User.objects. filter ().excute(age = 10 ) / / 查询年龄不为 10 的用户
User.objects. filter ().excute(age__in = [ 10 , 20 ]) / / 查询年龄不为在 [ 10 , 20 ] 的用户
|
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。
原文链接:http://www.cnblogs.com/xsmile/p/7835235.html