Django中ORM表的创建和增删改查方法示例


Posted in Python onNovember 15, 2017

前言

Django作为重量级的Python web框架,在做项目时肯定少不了与数据库打交道,编程人员对数据库的语法简单的还行,但过多的数据库语句不是编程人员的重点对象。因此用ORM来操作数据库相当快捷。今天来介绍一下用ORM操作数据库。

一、创建Django项目

可以使用pycharme专业版直接快速创建。如果不是专业版也可以使用命令进行创建。下面列出命令行创建方式:

django-admin startproject orm_test

这时会在当前目录创建文件夹名为orm_test,接下来进入orm_test文件夹中,执行命令:

python manage.py runserver

就启动了该项目,默认浏览器访问127.0.0.1:8000就可以看到项目运行成功的提示。

接下来我们用命令在项目中创建一个应用:

django-admin startapp cmdb

此时基本准备就做好了。

二、修改配置文件

把我们的应用即cmdb添加到 setting.py 的 INSTALLED_APPS 中:

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 ,对内容进行修改:

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 中加入以下代码才能正常运行。

import pymysql
 pymysql.install_as_MySQLdb()

三、写模板文件来创建表结构

在应用(cmdb)的 models.py 中开始写表结构,我们要做的就是写一个类,类中的属性为表中的列,ORM将类转换为sql语句。简单的写一个下面的类,包含用户名和密码两列。

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;

Django中ORM表的创建和增删改查方法示例

看到的不仅有两个自定的属性列,多出一个id列,并且是自增的还是主键。

五、路由映射关系

在同名项目文件夹下的urls.py 中导入应用(cmdb),写映射关系到cmdb的views.py

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函数中写入增删改查的语句。

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,表示相关的数据操作已成功修改数据表。
相关操作后数据表内容的变化如下:

#插入一条数据后
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:

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)

大于、大于等于

__gt 大于
__gte 大于等于

User.objects.filter(age__gt=10) // 查询年龄大于10岁的用户
User.objects.filter(age__gte=10) // 查询年龄大于等于10岁的用户

小于、小于等于

__lt 小于
__lte 小于等于

User.objects.filter(age__lt=10)  // 查询年龄小于10岁的用户
User.objects.filter(age__lte=10) // 查询年龄小于等于10岁的用户

in

__in

查询年龄在某一范围的用户
User.objects.filter(age__in=[10, 20, 30])

like

__exact    精确等于 like 'aaa'
__iexact    精确等于 忽略大小写 ilike 'aaa'
__contains   包含 like '%aaa%'
__icontains  包含 忽略大小写 ilike '%aaa%',但是对于sqlite来说,contains的作用效果等同于icontains。

is null / is not null

__isnull 判空

User.objects.filter(username__isnull=True)  // 查询用户名为空的用户
User.objects.filter(username__isnull=False) // 查询用户名不为空的用户

不等于/不包含于

User.objects.filter().excute(age=10)  // 查询年龄不为10的用户
User.objects.filter().excute(age__in=[10, 20]) // 查询年龄不为在 [10, 20] 的用户

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
python实现在windows下操作word的方法
Apr 28 Python
Python读大数据txt
Mar 28 Python
Python基于Pymssql模块实现连接SQL Server数据库的方法详解
Jul 20 Python
tensorflow实现简单的卷积神经网络
May 24 Python
Python根据指定日期计算后n天,前n天是哪一天的方法
May 29 Python
python和mysql交互操作实例详解【基于pymysql库】
Jun 04 Python
浅谈Python中函数的定义及其调用方法
Jul 19 Python
python实现logistic分类算法代码
Feb 28 Python
Django-simple-captcha验证码包使用方法详解
Nov 28 Python
python 逆向爬虫正确调用 JAR 加密逻辑
Jan 12 Python
http通过StreamingHttpResponse完成连续的数据传输长链接方式
Feb 12 Python
图神经网络GNN算法
May 11 Python
11月编程语言排行榜 Python逆袭C#上升到第4
Nov 15 #Python
Python竟能画这么漂亮的花,帅呆了(代码分享)
Nov 15 #Python
Python中turtle作图示例
Nov 15 #Python
Django原生sql也能使用Paginator分页的示例代码
Nov 15 #Python
使用Python的turtle模块画图的方法
Nov 15 #Python
python绘制铅球的运行轨迹代码分享
Nov 14 #Python
Python实现句子翻译功能
Nov 14 #Python
You might like
php中DOMDocument简单用法示例代码(XML创建、添加、删除、修改)
2010/12/19 PHP
thinkPHP实现将excel导入到数据库中的方法
2016/04/22 PHP
JS中window.open全屏命令解析及使用示例
2013/12/11 Javascript
判断文档离浏览器顶部的距离的方法
2014/01/08 Javascript
深入探密Javascript数组方法
2015/01/08 Javascript
jquery实现简单的轮换出现效果实例
2015/07/23 Javascript
JS基于myFocus库实现各种功能的tab选项卡切换效果
2015/09/19 Javascript
AngularJS开发教程之控制器之间的通信方法分析
2016/12/25 Javascript
d3.js中冷门却实用的内置函数总结
2017/02/04 Javascript
用js制作淘宝放大镜效果
2020/10/28 Javascript
JavaScript实现弹窗效果代码分析
2017/03/09 Javascript
JavaScript数组去重的多种方法(四种)
2017/09/19 Javascript
微信小程序-getUserInfo回调的实例详解
2017/10/27 Javascript
微信小程序progress组件使用详解
2018/01/31 Javascript
微信小程序实现循环动画效果
2018/07/16 Javascript
element-ui点击查看大图的方法示例
2020/12/14 Javascript
[01:53]3.19 DOTA2发布会 现场精彩Coser表演
2014/03/25 DOTA
python socket多线程通讯实例分析(聊天室)
2016/04/06 Python
Queue 实现生产者消费者模型(实例讲解)
2017/11/13 Python
Python实现基本数据结构中栈的操作示例
2017/12/04 Python
python机器学习之贝叶斯分类
2018/03/26 Python
Django框架实现的普通登录案例【使用POST方法】
2019/05/15 Python
Python多进程方式抓取基金网站内容的方法分析
2019/06/03 Python
python实现猜拳小游戏
2020/04/05 Python
python os.path.isfile 的使用误区详解
2019/11/29 Python
python加载自定义词典实例
2019/12/06 Python
Python 实现加密过的PDF文件转WORD格式
2020/02/04 Python
Python面向对象程序设计之类和对象、实例变量、类变量用法分析
2020/03/23 Python
Internet体系结构
2014/12/21 面试题
小学体育教学反思
2014/01/31 职场文书
白岩松演讲
2014/05/21 职场文书
2015新生加入学生会自荐书
2015/03/24 职场文书
PHP中多字节字符串操作实例详解
2021/08/23 PHP
Docker下安装Oracle19c
2022/04/13 Servers
vue使用element-ui按需引入
2022/05/20 Vue.js
GO中sync包自由控制并发示例详解
2022/08/05 Golang