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 相关文章推荐
使用Python的Treq on Twisted来进行HTTP压力测试
Apr 16 Python
Python使用multiprocessing实现一个最简单的分布式作业调度系统
Mar 14 Python
使用python的pandas库读取csv文件保存至mysql数据库
Aug 20 Python
基于python实现学生管理系统
Oct 17 Python
Python爬取成语接龙类网站
Oct 19 Python
python模拟登陆,用session维持回话的实例
Dec 27 Python
python 获取utc时间转化为本地时间的方法
Dec 31 Python
Python collections模块使用方法详解
Aug 28 Python
Python类中方法getitem和getattr详解
Aug 30 Python
Python中filter与lambda的结合使用详解
Dec 24 Python
Python3+selenium实现cookie免密登录的示例代码
Mar 18 Python
编写python代码实现简单抽奖器
Oct 20 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
PHP与已存在的Java应用程序集成
2006/10/09 PHP
JSON 编辑器实现代码
2009/12/06 Javascript
jQuery AnythingSlider滑动效果插件
2010/02/07 Javascript
页面按钮禁用与解除禁用的方法
2014/02/19 Javascript
js获取指定的cookie的具体实现
2014/02/20 Javascript
JavaScript访问字符串中单个字符的两种方法
2015/07/03 Javascript
JavaScript知识点总结(四)之逻辑OR运算符详解
2016/05/31 Javascript
浅谈js数据类型判断与数组判断
2016/08/29 Javascript
javascript创建对象的3种方法
2016/11/02 Javascript
jQuery实现字符串全部替换的方法
2016/12/12 Javascript
jQuery插件HighCharts绘制2D金字塔图效果示例【附demo源码下载】
2017/03/09 Javascript
JS实现快速比较两个字符串中包含有相同数字的方法
2017/09/11 Javascript
Vue2.0 http请求以及loading展示实例
2018/03/06 Javascript
微信小程序实现的绘制table表格功能示例
2019/04/26 Javascript
jquery多级树形下拉菜单的实例代码
2019/07/09 jQuery
vue-cli3 热更新配置操作
2020/09/18 Javascript
python实现数通设备tftp备份配置文件示例
2014/04/02 Python
浅谈Python的文件类型
2016/05/30 Python
python集合比较(交集,并集,差集)方法详解
2018/09/13 Python
如何更优雅地写python代码
2019/07/02 Python
关于tf.nn.dynamic_rnn返回值详解
2020/01/20 Python
Python使用shutil模块实现文件拷贝
2020/07/31 Python
Python实现简单的猜单词小游戏
2020/10/28 Python
打印机墨盒:123Inkjets
2017/02/16 全球购物
瑞士图书网站:Weltbild.ch
2019/09/17 全球购物
保加利亚服装和鞋类购物网站:Bibloo.bg
2020/11/08 全球购物
幼儿园家长评语
2014/02/10 职场文书
总经理工作职责范文
2014/03/14 职场文书
公司委托书怎么写
2014/08/02 职场文书
小学入学感言
2015/08/01 职场文书
公司车辆维修管理制度
2015/08/05 职场文书
2019XX公司员工考核管理制度!
2019/08/07 职场文书
创业计划书之网络外卖
2019/10/31 职场文书
PHP控制循环操作的时间
2021/04/01 PHP
Mysql服务添加 iptables防火墙策略的方案
2021/04/29 MySQL
Java Redisson多策略注解限流
2022/09/23 Java/Android