1 需求
现有的业务数据需要经常被展示,所以选择django作为展示工具。只需要使用django自带的admin app,然后对现有数据库进行建模就可以搞定。
2 代码
settings:
DATABASES = { # 'default': { # 'ENGINE': 'django.db.backends.sqlite3', # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), # }, 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'mysite', 'USER': 'root', 'PASSWORD': 'root', 'HOST': '127.0.0.1', 'PORT': '3306', 'OPTIONS': { 'init_command': "SET sql_mode='STRICT_TRANS_TABLES'", }, }, 'testconfig': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'config', 'USER': 'root', 'PASSWORD': 'root', 'HOST': '127.0.0.1', 'PORT': '3306', 'OPTIONS': { 'init_command': "SET sql_mode='STRICT_TRANS_TABLES'", }, }}DATABASE_ROUTERS = ['sqlsite.dbrouter.AppRouter']DATABASE_APPS_MAPPING = { # example: #'app_name':'database_name', 'app': 'testconfig', 'admin': 'default', 'auth': 'default', 'contenttypes': 'default', 'sessions': 'default',}#配置两个sql,第一个是dj自用,第二个是用于连接展示库#配置db路由,由AppRouter进行配置#db映射,将app映射到testconfig,dj自带app映射到default
dbrouter.py(和settings同目录)
from django.conf import settingsDATABASE_MAPPING = settings.DATABASE_APPS_MAPPINGclass AppRouter: def db_for_read(self, model, **hints): if model._meta.app_label in DATABASE_MAPPING: return DATABASE_MAPPING[model._meta.app_label] return None def db_for_write(self, model, **hints): if model._meta.app_label in DATABASE_MAPPING: return DATABASE_MAPPING[model._meta.app_label] return None def allow_relation(self, obj1, obj2, **hints): db_obj1 = DATABASE_MAPPING.get(obj1._meta.app_label) db_obj2 = DATABASE_MAPPING.get(obj2._meta.app_label) if db_obj1 and db_obj2: if db_obj1 == db_obj2: return True else: return False return None def allow_syncdb(self, db, model): if db in DATABASE_MAPPING.values(): return DATABASE_MAPPING.get(model._meta.app_label) == db elif model._meta.app_label in DATABASE_MAPPING: return False return None def allow_migrate(self, db, app_label, model_name=None, **hints): if db in DATABASE_MAPPING.values(): return DATABASE_MAPPING.get(app_label) == db elif app_label in DATABASE_MAPPING: return False return None#这个文件直接cp到任何项目都可以,不用改
3 生成数据库模型
python3 manage.py inspectdb --database=testconfig > app/models.py#可以将现有库testconfig 的模型生成到models.py#这个功能非常方便,不再需要自己去做模型#最后在models.py里添加admin的注册功能,就可以使用admin管理先有库
4 bug处理
4.1
admin多表中字段的显示,如果字段太长,它不换行,要换行显示
base.css:
/* TABLES */table { border-collapse: collapse; border-color: #ccc; word-wrap: break-word; word-break: break-all;}
4.2
有个数据库连接报错:SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTE。原因是版本低,为5.1。另一个5.6的就不会出现问题。
解决办法:修改settings里该mysql配置的参数
'OPTIONS': { 'init_command': "SET sql_mode='STRICT_TRANS_TABLES'", 'isolation_level':None},#在options里设定事务隔离级别为None
4.3
取回的数据中文乱码,中文写入失败
由于线上表编码为latin1,所以暂时无解。
4.4
使用admin修改字段时,提示字段必须填入内容
解决办法:在models中的表结构中。在字段里加入,blank=True,意思是可以在django层面允许空。
然后migrate,重启服务。
参考
https://www.cnblogs.com/zhangxinqi/p/9094953.html
https://www.jianshu.com/p/04cd9d4f67a2