Django基于ORM操作数据库的方法详解


Posted in Python onMarch 27, 2018

本文实例讲述了Django基于ORM操作数据库的方法。分享给大家供大家参考,具体如下:

1、配置数据库

vim settings #HelloWorld/HelloWorld目录下
DATABASES = {
  'default': {
    'ENGINE': 'django.db.backends.mysql', #mysql数据库中第一个库test
    'NAME': 'test',
    'USER': 'root',
    'PASSWORD': '123456',
    'HOST':'127.0.0.1',
    'PORT':'3306',
  },
  'article': {
    'ENGINE': 'django.db.backends.mysql', # mysql数据库中第二个库test2
    'NAME': 'test2',
    'USER': 'root',
    'PASSWORD': '123456',
    'HOST':'127.0.0.1',
    'PORT':'3306',
  }
}

2、在项目目录中建立“web站点”(app)

django-admin.py startapp blog ##HelloWorld/目录下建立网站app,我建了两个app(blog和article)

Django基于ORM操作数据库的方法详解

3、配置新建的app(blog和article)

vim settings ##/HelloWorld/HelloWorld目录下
INSTALLED_APPS = [
  'django.contrib.admin',
  'django.contrib.auth',
  'django.contrib.contenttypes',
  'django.contrib.sessions',
  'django.contrib.messages',
  'django.contrib.staticfiles',
  'blog',
  'article',
]

4、以blog为例,创建模型

vim models.py ##blog目录下
from django.db import models
# Create your models here.
class Teacher(models.Model):
  id = models.IntegerField(primary_key=True)
  name = models.CharField(max_length=50)
  class Meta:
    db_table = 'teacher'#默认库test中建立名为teacher的表。字段就是id和name

5、同步模型到数据库中

python manage.py migrate ##建立Django系统表,首次运行即可
python manage.py makemigrations ##生成迁移计划,每次加表或字段时都运行生成计划
python manage.py migrate ##同步用户定义的表
vim models.py #blog目录下,新建个表测试下,可以在添加或修改删除几个字段试试
class Student(models.Model):
  id = models.IntegerField(primary_key=True)
  name = models.CharField(max_length=50)
  student_number = models.CharField(default="",max_length=50)
  class Meta:
    db_table = 'student'

6、多个数据库的使用,上边的blog应用对应数据库中的test库,再搭建个应用article用test2这个库。这样一个项目中的两个应用分别用不同的库。

我上边已经创建好了article应用,并且配置好了settings.py中的DATABASES项中对应数据库为test2。注意article这个名字要一致。

cd article #进入article目录
vim models.py #article目录下
from django.db import models
class Author(models.Model):
  id = models.IntegerField(primary_key=True)
  name = models.CharField(max_length=50)
  author_ids = models.CharField(max_length=50)
  class Meta:
    db_table = 'author'
    app_label = 'article' ##对应的article这个应用,名字要一致
python manage.py makemigrations article ##生成同步计划
##对article应用执行同步,同步到 article(settings中的配置,对应test2)对应的数据库中.
python migrate article --database article ##执行计划,必须加--database 指定要同步的库

7、第6步多个应用使用各自的数据库已经配置好了,但是存在一个应用使用多个数据库的情况,此步进行配置。

cd blog #进入blog目录下
vim models.py ##blog目录下,在文件中增加一个表,注意后边app_label
class Group(models.Model):
  id = models.IntegerField(primary_key=True)
  group_name = models.CharField(max_length=50)
  class Meta:
    db_table = 'group'
    app_label = 'article' ##必须指定这个库
python manage.py makemigrations article ##生成同步计划,虽说改的是blog
python migrate article --database article ##执行计划,虽说改的是blog

8、开始操作数据库测试,以blog为例:

参看网址:http://www.runoob.com/django/django-model.html

vim view.py ##blog目录下,添加下列代码
from blog.models import Teacher
def orm_handle_db(request):
  test1 = Teacher(id=1,name='runoob',teacher_number='10') ##定义数据
  test1.save() ##保存
  return render_to_response('orm_handle_db.html')
vim urls.py ##blog目录下
from django.conf.urls import url
from blog import views
urlpatterns = [
  url(r'^hello/$', views.hello),
  url(r'^search/$', views.search),
  url(r'^post_search/$', views.post_search),
  url(r'^search_submit$', views.search_submit),
  url(r'^post_search_submit$', views.post_search_submit),
  url(r'^db_handle/$', views.db_handle),
  url(r'^orm_handle_db/$', views.orm_handle_db), ##这里配置好
]
vim orm_handle_db.html ##blog/templates目录下

数据库操作

其它操作:增删改查和排序分组操作自己查询即可,下方图像参考

 Django基于ORM操作数据库的方法详解

9、操作另一个数据库test2怎么弄呢

vim settings.py ##HelloWorld/HelloWorld目录下,添加下面两项
DATABASES_APPS_MAPPING = {
  'blog': 'default',
  'article': 'article',
    }
DATABASE_ROUTERS = ['HelloWorld.database_app_router.DatabaseAppsRouter']
vim database_app_router.py ##配置路由 ,HelloWorld/HelloWorld/目录下。直接粘贴
from django.conf import settings
class DatabaseAppsRouter(object):
def db_for_read(self, model, **hints):
app_label = model._meta.app_label
if app_label in settings.DATABASES_APPS_MAPPING:
res = settings.DATABASES_APPS_MAPPING[app_label]
print(res)
return res
return None
def db_for_write(self, model, **hints):
app_label = model._meta.app_label
if app_label in settings.DATABASES_APPS_MAPPING:
return settings.DATABASES_APPS_MAPPING[app_label]
return None
def allow_relation(self, obj1, obj2, **hints):
db_obj1 = settings.DATABASES_APPS_MAPPING.get(obj1._mata.app_label)
db_obj2 = settings.DATABASES_APPS_MAPPING.get(obj2._mata.app_label)
if db_obj1 and db_obj2:
if db_obj1 == db_obj2:
return True
else:
return False
return None
def db_for_migrate(self, db, app_label, model_name=None, **hints):
if db in settings.DATABASES_APPS_MAPPING.values():
return settings.DATABASES_APPS_MAPPING.get(app_label) == db
elif app_label in settings.DATABASES_APPS_MAPPING:
return False
return None

之后再像第8步那样操作数据库即可,会自动路由找到相应的数据库

vim views.py #blog目录下,添加下方代码
from blog.models import Teacher,Group##这是第8步没有的
def orm_handle_db(request):
  test1 = Teacher(id=1,name='runoob',teacher_number='10')
  test2 = Group(id=1,group_name='runoob') ##这是第8步没有的
  test1.save()
  test2.save()##这是第8步没有的
  return render_to_response('orm_handle_db.html')

10、对于单个库中的表链接操作(1对1、多对1、多对多)。如有需要参看视频。实在是不想用外键的方式

11、夸库的表链接操作django不支持,需要使用绕过orm的方式进行操作。见总结文档

总结:简单操作用ORM,复杂操作用绕过ORM方式。

希望本文所述对大家Django框架的Python程序设计有所帮助。

Python 相关文章推荐
详解Django中的ifequal和ifnotequal标签使用
Jul 16 Python
最大K个数问题的Python版解法总结
Jun 16 Python
使用python 和 lint 删除项目无用资源的方法
Dec 20 Python
一个Python最简单的接口自动化框架
Jan 02 Python
numpy中实现ndarray数组返回符合特定条件的索引方法
Apr 17 Python
Python3正则匹配re.split,re.finditer及re.findall函数用法详解
Jun 11 Python
python增加图像对比度的方法
Jul 12 Python
Python基于OpenCV实现人脸检测并保存
Jul 23 Python
Python高级特性 切片 迭代解析
Aug 23 Python
Python 矩阵转置的几种方法小结
Dec 02 Python
Python爬虫HTPP请求方法有哪些
Jun 03 Python
Python中qutip用法示例详解
Oct 02 Python
利用Python批量提取Win10锁屏壁纸实战教程
Mar 27 #Python
Django学习笔记之ORM基础教程
Mar 27 #Python
Python使用xlwt模块操作Excel的方法详解
Mar 27 #Python
Python安装图文教程 Pycharm安装教程
Mar 27 #Python
python 接口返回的json字符串实例
Mar 27 #Python
使用Django和Python创建Json response的方法
Mar 26 #Python
python查询mysql,返回json的实例
Mar 26 #Python
You might like
PhpMyAdmin出现export.php Missing parameter: what /export_type错误解决方法
2012/08/09 PHP
详解PHP中的PDO类
2015/07/06 PHP
JavaScript:new 一个函数和直接调用函数的区别分析
2013/07/10 Javascript
通过一段代码简单说js中的this的使用
2013/07/23 Javascript
Microsfot .NET Framework4.0框架 安装失败的解决方法
2013/08/14 Javascript
原生JS操作网页给p元素添加onclick事件及表格隔行变色
2013/12/01 Javascript
解析img图片没找到onerror事件 Stack overflow at line: 0
2013/12/23 Javascript
深入理解javascript的执行顺序
2014/04/04 Javascript
js中回调函数的学习笔记
2014/07/31 Javascript
jQuery中removeAttr()方法用法实例
2015/01/05 Javascript
moment.js轻松实现获取当前日期是当年的第几周
2015/02/05 Javascript
JS+CSS实现的竖向简洁折叠菜单效果代码
2015/10/22 Javascript
window.setInterval()方法的定义和用法及offsetLeft与style.left的区别
2015/11/11 Javascript
jQuery深拷贝Json对象简单示例
2016/07/06 Javascript
浅析JS中的 map, filter, some, every, forEach, for in, for of 用法总结
2017/03/29 Javascript
js学习总结之DOM2兼容处理顺序问题的解决方法
2017/07/27 Javascript
Vue项目全局配置微信分享思路详解
2018/05/04 Javascript
微信小程序排坑指南详解
2018/05/23 Javascript
Layer.js实现表格溢出内容省略号显示,悬停显示全部的方法
2019/09/16 Javascript
js实现百度登录窗口拖拽效果
2020/03/19 Javascript
基于react项目打包css引用路径错误解决方案
2020/10/28 Javascript
分析用Python脚本关闭文件操作的机制
2015/06/28 Python
Python IDLE清空窗口的实例
2018/06/25 Python
Pygame的程序开始示例代码
2020/05/07 Python
详解selenium + chromedriver 被反爬的解决方法
2020/10/28 Python
Python接口自动化系列之unittest结合ddt的使用教程详解
2021/02/23 Python
DHC中国官方购物网站:日本通信销售No.1化妆品
2016/08/20 全球购物
全球第二大家装零售商:Lowe’s
2018/01/13 全球购物
Myprotein比利时官方网站:欧洲第一运动营养品牌
2020/10/04 全球购物
金融专业推荐信
2013/11/14 职场文书
青年创业培训欢迎词
2014/01/10 职场文书
餐厅销售主管职责范本
2014/02/19 职场文书
社区工作者个人总结
2015/02/28 职场文书
面试复试通知单
2015/04/24 职场文书
2016年国庆节67周年活动总结
2016/04/01 职场文书
MySQL命令行操作时的编码问题详解
2021/04/14 MySQL