Django开发——集成已有的数据库和应用

本文介绍如何使用Django管理已存在的数据库,包括利用inspectdb工具生成模型代码、清理及定制模型,以及如何整合Django认证系统。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据库,各种表结构已经创建好了,甚至连数据都有了,此时,我要用Django管理这个数据库,ORM映射怎么办?
虽然Django最适合于green-field,即从头开始一个项目。但是将这个框架和以前的遗留的数据库和应用相整合仍然是可能的。

与遗留数据库的整合

Django的数据库才层从python代码生成SQL schemas,但对于遗留数据库,你已经拥有了SQL schemas。这种情况你需要为已经存在的数据表创建model,为此Djangi自带了一个可以通过读取你的数据表结构来生成model的工具,该辅助工具称为inspectdb。可以通过manage.py inspectdb 来调用它.
使用inspectdb
inspectdb工具自省你配置文件指向的数据库,针对每一个表生成一个Django模型,然后将这些python模型的代码显示在系统的标准输出里面。

一个从头开始针对一个典型的遗留数据库的整合过程。前提条件是安装了Django和一个传统的数据库。

  • 建立一个Django的项目,django-admin.py startproject mysite;
  • 编辑项目中的配置文件,告诉Django你的数据库连接参数和数据库名。
  • 通过运行python manage startapp myapp创建一个Django应用;
  • 运行python mysite/manage.py inspectdb 这将检查DATABASE_NAME数据库中所有的表并打印出每张表生成的模型类。
  • 将标准shell的输出重定向,保存输出到你的应用的models.py
[kiosk@foundation155 mysite]$ python manage.py  inspectdb > myapp/models.py 

编辑mysite/myapp/models.py文件以清理生成的models并且做一些必要的自定义。
清理生成的Models
你需要对产生的模型代码做些许清理。

  • 数据库的每一个表都会被转化为一个model类。这意味着你需要为多对多连接表重构其models为ManyToManyField的对象。所生成的每一个model中的每个字段都拥有自己的属性,包括id主键字段。
  • 如果某个model没有主键的时候,那么Django会为其自动增加一个id主键字段。你或许想移除这行代码因为这样不仅是冗余的码而且如果当你的应用需要向这些表中增加新纪录时,会导致某些问题。
  • 每一个字段都是通过查找数据库列类型来确定的。取过inspectdb无法把某个数据库字段映射导model字段上,它会使用TextField字段进行代替,并且会在所生成的model字段后面加入注释“该字段类型是猜的”。
  • 如果你的数据库中的某个字段在Django中找不到合适的对应物,你可以忽略它,因为Django模型层不要求导入数据表中的每个列。
  • 如果数据库中某个列的名字是P与桃红的保留字, inspectdb会在每个属性名后加上_field,并将db_column属性设置为真实的字段名。
  • 如果数据库中的某张表引用了其他表,就像外键和多键,需要是党的四ugai所生成model的顺序,以使得这种引用能够正确映射。
  • 对于PostgreSQL,MySQL和SQLite数据库系统,insoectdb能够自动检测出主键关系。也就是说,它会在合适的位置插入
    primary_key=True,而对于其他数据库系统,你必须为每个model中至少一个字段插入这样的语句。因为这个主键字段是必须有的。
  • 外键检测仅对PostgreSQL,还有MySQL表中的某些特定类型生效。 至于其他数据库,外键字段将在假定其为INT列的情况下被自动生成为IntegerField。

与认证系统的整合

将Django与其他先由认证系统的用户名和密码或者认证方法进行整合。
例如:你所在公司也许已经安装了LDAP,并且为每一个员工都存储了性硬的用户名和密码。如果用户在LADP和基于Django的应用上拥有独立的帐号,那么这是无论对于网络管理员还是用户自己来说都是一件很令人头疼的事情。为了解决这样的问题,Django认证系统能让你以插件的方式与其他认证资源进行交互,可以覆盖Django默认的基于数据库的模式,还可以使用默认的系统与其他系统进行交互。
指定认证后台
在后台,Django维护了一个用于检查认证的后台列表。当某个人调用django.contrib.auth.authenticate()时,Django会尝试对其认证后台进行遍历认证。如果第一个认证失败,Django会尝试认证第二个,以此类推,直到认证完。
认证后台列表在AUTHENTICATION_BACKENDS设置中进行指定。
默认情况下,

('django.contrib.auth.backends.ModelBackend',)

用来检测Django用户数据库的基本认证模式。
编写认证后台
一个认证后台其时就是一个实现了:get_user(id) 和 authenticate(**credentials),方法get_user(id)需要一个参数id,id可以是用户名,数据库ID或者其他任何数值,该方法会返回一个User对象。

class MyBackend(object):
def authenticate(self, username=None, password=None):
# Check the username/password and return a User.

每个方法中authenticate都应该检测它所获取的证书,当证书有效时,返回一个匹配于该证书的User对象,如果证书无效或者不合法则返回None。
Django管理系统紧密连接于其自己后台数据库的User对象。实现这个功能最好的方法时为你的后台数据库中的每个用户都创建一个对应的Django User对象。
以下是一个示例后台程序,该后台用于认证定义在settings.py文件中的username和password变量,并且在该用户第一次认证的时候创建一个相应的Django User对象。

from django.conf import settings
from django.contrib.auth.models import User, check_password
class SettingsBackend(object):
	"""
	Authenticate against the settings ADMIN_LOGIN and ADMIN_PASSWORD.
	Use the login name, and a hash of the password. For example:
	ADMIN_LOGIN = 'admin'
	ADMIN_PASSWORD = 'sha1$4e987$afbcf42e21bd417fb71db8c66b321e9fc33051de'
	"""
	def authenticate(self, username=None, password=None):
		login_valid = (settings.ADMIN_LOGIN == username)
		pwd_valid = check_password(password, settings.ADMIN_PASSWORD)
		if login_valid and pwd_valid:
		try:
			user = User.objects.get(username=username)
		except User.DoesNotExist:
			# Create a new user. Note that we can set password
			# to anything, because it won't be checked; the password
			# from settings.py will.
			user = User(username=username, password='get from settings.py')
			user.is_staff = True
			user.is_superuser = True
			user.save()
			return user
		return None
	def get_user(self, user_id):
	try:
	return User.objects.get(pk=user_id)
	except User.DoesNotExist:
	return None
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值