假如在一个django项目中使用到了不只一个数据库, 其实这在大一点的工程中很常见,比如主从库

那么会涉及到如下一些东西

1, 定义

在settings中的DATABASE中定义会使用到的数据,比如除default外我们还定义了一个 search

 DATABASE = {
'default':{
'ENGINE': 'django.db.backends.sqlite3',
'NAME': 'path/to/database.sqllite3',
'USER':'',
'PASSWORD':'',
'HOST': '',
'PORT':'',
},
'search':{
'ENGINE': 'django.db.backends.mysql',
'NAME': 'search_db',
'USER':'db_user',
'PASSWORD':'p@55word',
'HOST': '192.168.12.186',
'PORT':'',
}
}

2, 使用

会产生数据库操作的几个地方

  • Model对象
  • QuerySet
  • manager

假如有Model对象 obj

它的save()会执行  INSERT 或  UPDATE

它的 delete() 会执行  DELETE

我们拿到一个obj,或者创建一个新的obj后,使用非default db时,  参数中传进using

obj = Person(name='wy', uid=530)
obj.save(using='search')
obj.delete(using='search')

通过manager拿到的都是QuerySet, 它对应数据库中的一个集合, 对应的语句是 SELECT

QuerySet有using方法, 指定去SELECT的数据库, 而QuerySet有一组方法是返回QuerySet对象的,所以只要在这个调用链中使用 using 就行

Person.objects.all().using('search').filter(uid__gt=100)

而manager本身提供了一个方法using, 这么定义的

def using(self, *args, **kwargs):
return self.get_queryset().using(*args, **kwargs)

所以上面那行代码等效于

Person.objects.using('search').filter(uid__gt=100)

有时候我们会在manager层面设置使用的数据库. 比如对自定义的manager.

自定义的manager常见的一个情况是重写get_queryset()方法, 比如一个lady_manager,它可以重写get_queryset()只返回所有lady,然后再在这个基础上filter...

其实manager返回的QuerySet的_db是manager自己的_db传过去的, 而manager有 db_manager()这个方法来设置自身的_db

def db_manager(self, using):
obj = copy.copy(self)
obj._db = using
return obj

所以只要这么用就好, 假如Person有一个自定义manager   ladies

Person.ladies.db_manager('search').all()

 3, admin使用多数据库

admin是django自带的一个app,那它涉及的是,读一个Model的所有对象(读一张表SELECT), 增加,删除,那么重写admin.ModelAdmin的如下几个做这几件事方法就好了

class MultiDBModelAdmin(admin.ModelAdmin):
# A handy constant for the name of the alternate database.
using = 'other' def save_model(self, request, obj, form, change):
# Tell Django to save objects to the 'other' database.
obj.save(using=self.using) def delete_model(self, request, obj):
# Tell Django to delete objects from the 'other' database
obj.delete(using=self.using) def get_queryset(self, request):
# Tell Django to look for objects on the 'other' database.
return super(MultiDBModelAdmin, self).get_queryset(request).using(self.using) def formfield_for_foreignkey(self, db_field, request=None, **kwargs):
# Tell Django to populate ForeignKey widgets using a query
# on the 'other' database.
return super(MultiDBModelAdmin, self).formfield_for_foreignkey(db_field, request=request, using=self.using, **kwargs) def formfield_for_manytomany(self, db_field, request=None, **kwargs):
# Tell Django to populate ManyToMany widgets using a query
# on the 'other' database.
return super(MultiDBModelAdmin, self).formfield_for_manytomany(db_field, request=request, using=self.using, **kwargs)

如上代码摘自django文档,关于 formfield_for_foreignkey 和  formfield_for_manytomany 还没细研究

把上面的类定义放到自己的代码中,然后自己的ModelAdmin从它派生就行了, using中指定要使用的数据库, 如

class PersonAdmin(MultiDBAdmin):
pass
admin.site.register(PersonAdmin, Person)

-----------------------

参考:

https://docs.djangoproject.com/en/1.6/topics/db/multi-db/

django 项目中使用多数据库 multiple databases的更多相关文章

  1. Django项目连接多个数据库配置

    1.设置数据库连接 pip install PyMySQL 2.在项目同名目录myproject/myproject下的__init__.py添加以下代码 import pymysql pymysql ...

  2. 【技术博客】JWT的认证机制Django项目中应用

    开发组在开发过程中,都不可避免地遇到了一些困难或问题,但都最终想出办法克服了.我们认为这样的经验是有必要记录下来的,因此就有了[技术博客]. JWT的认证机制Django项目中应用 这篇技术博客基于软 ...

  3. celery 分布式异步任务框架(celery简单使用、celery多任务结构、celery定时任务、celery计划任务、celery在Django项目中使用Python脚本调用Django环境)

    一.celery简介: Celery 是一个强大的 分布式任务队列 的 异步处理框架,它可以让任务的执行完全脱离主程序,甚至可以被分配到其他主机上运行.我们通常使用它来实现异步任务(async tas ...

  4. 在项目中使用SQLite数据库小结

    ------------------------------------------------------------------------推荐: - VS2012 使用 1.0.84 版的库 - ...

  5. [翻译]在Django项目中添加谷歌统计(Google Analytics)

    原文:<Google Analytics tracking code into Django projects, the easy way> 对我来说,制作一个可扩展的Django应用随时 ...

  6. Django项目中使用Redis

    Django项目中使用Redis DjangoRedis 1 redis Redis 是一个 key-value 存储系统,常用于缓存的存储.django-redis 基于 BSD 许可, 是一个使 ...

  7. 在Xamarin.iOS项目中使用预设数据库

    在Xamarin.iOS项目中使用预设数据库 当开发者准备好一个预设数据库文件后,就可以将这个数据库文件添加到创建的项目中了.本节将分别在Xamarin.iOS和Xamarin.Android项目中使 ...

  8. 擦他丫的,今天在Django项目中引用静态文件jQuery.js 就是引入报错,终于找到原因了!

    擦 ,今天在Django项目中引用静态文件jQuery.js 就是引入报错,终于找到原因了! 问题在于我使用的谷歌浏览器,默认使用了缓存,导致每次访问同一个url时,都返回的是缓存里面的东西.通过谷歌 ...

  9. django 项目中的 favicon.ico 处理

    django 项目中的 favicon.ico 处理  (django == 2.0.6) 1. 引入模块: from django.views.generic.base import Redirec ...

随机推荐

  1. java基础解析系列(一)---String、StringBuffer、StringBuilder

    java基础解析系列(一)---String.StringBuffer.StringBuilder 前言:本系列的主题是平时容易疏忽的知识点,只有基础扎实,在编码的时候才能更注重规范和性能,在出现bu ...

  2. HDU 1083 - Courses - [匈牙利算法模板题]

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1083 Time Limit: 20000/10000 MS (Java/Others) M ...

  3. HDU 1565 - 方格取数(1) - [状压DP][网络流 - 最大点权独立集和最小点权覆盖集]

    题目链接:https://cn.vjudge.net/problem/HDU-1565 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32 ...

  4. Python爬虫框架Scrapy实例(四)下载中间件设置

    还是豆瓣top250爬虫的例子,添加下载中间件,主要是设置动态Uesr-Agent和代理IP Scrapy代理IP.Uesr-Agent的切换都是通过DOWNLOADER_MIDDLEWARES进行控 ...

  5. Linux上Oracle 11g安装步骤图解

    Oracle 11g下载地址: http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html 选 ...

  6. JS "eval智能" 工厂模式

    <script> var Shop = function () { this.name = function () { document.write("商店的名字 <br/ ...

  7. Fire Game--FZU2150(bfs)

    http://acm.fzu.edu.cn/problem.php?pid=2150 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=659 ...

  8. router-link传参 query方式

    router.js内的路由配置 { path: '/CreateProgress', name: 'CreateProgress', component:CreateProgress }   传参(q ...

  9. 【PyQt5-Qt Designer】读取txt文件在打印

    from PyQt5.QtGui import QFont,QTextDocument,QTextCursor from PyQt5.QtWidgets import QApplication, QM ...

  10. Animator Override Controller学习及性能测试

    本文由博主(YinaPan)原创,转载请注明出处: http://www.cnblogs.com/xsln/p/Animator_Override_Controller.html 一.Animator ...