Django⾃定义表名和字段名
Django ⾃定义表名和字段名
通过db_table和db_column⾃定义数据表名和字段名
假如你的数据库⾥已经有了⼀张数据表,且该表包含多个字段,你希望通过Django直接访问该数据表的各个字段⽽不是重新建⽴新表,你这时可以通过db_table指定数据表名,还可以通过db_column指定希望访问的字段名。
在我们创建⼀个模型时,Django的ORM会根据应⽤名(app name), 模型名(model name)和字段名(field name)⾃动在数据库中创建数据表。⽐如我们有⼀个Blog的应⽤,⾥⾯有Article模型, 其中Article模型有title这个字段,那么Django默认会创建⼀个名为blog_article的数据表,其中有title这个字段。假如我们希望把表名改为article,标题改为article_title,以便与已经存在的数据表或字段建⽴映射关系,我们可以按如下代码操作。
class Article(models.Model):
"""⽂章模型"""
# 通过db_column⾃定义数据表中字段名
title = models.CharField('标题', max_length=200, db_column='article_title')
slug = models.SlugField('slug', max_length=60, blank=True)
def__str__(self):
return self.title
class Meta:
db_table = 'article'# 通过db_table⾃定义数据表名
通过db_index和Meta index选项给数据表字段建⽴索引
使⽤索引可快速访问数据库表中的特定信息。数据库索引好⽐是⼀本书前⾯的⽬录,没有索引⽬录的话,你访问书中某个页⾯需要从第1页遍历到最后⼀页,如果有⽬录,你可以快速地根据⽬录查到所需要的页⾯。Django项⽬中如果你需要频繁地对数据表中的某些字段(如title)使⽤filter(), exclude()和order_by()⽅法进⾏查询,我们强烈建议你对这些字段建议索引(index), 提升查询效率。
要对模型中的某个字段建⽴数据库索引,你可以使⽤db_index选项,也可以使⽤Meta选项建⽴索引。使⽤Meta选项的好处是你可以⼀次性对多个字段建⽴索引,还可以对多个字段建⽴组合索引。
⽅法⼀: 使⽤db_index选项
class Article(models.Model):
"""⽂章模型"""
# 使⽤db_index=True对title建⽴索引
title = models.CharField('标题', max_length=200, db_index=True)
⽅法⼆: 使⽤Meta选项
class Article(models.Model):
"""⽂章模型"""
title = models.CharField('标题', max_length=200,)
class Meta:
indexes = [
models.Index(fields=['title']),
]
Django主从数据库配置
当你刚刚开始建⽴⼀个⽹站时,可能每天只有数⼗到上百⼈访问。这时你只有⼀个数据库,所有APP的数据表也都放⼀起的,⼀台普通的服务器能够
应付, 也便于维护。但是当访问量上来后,你会发现⼀台服务器和⼀个数据库会根本应付不了这个压⼒。这时你可能希望实现数据库的主从配置,读写分离,把各个数据库放在不同的服务器上,有的专门负责写⼊,有的专门负责读取,这时你就要学会使⽤Django同时连接多个数据库,并⾃定义读写操作。
第⼀步修改项⽬的 settings 配置
在 settings.py 中配置需要连接的多个数据库名称和登录信息。在下例中我们⾃定义了3个数据库,1个主数据库(primary), 2个从数据库(replica)。
#project/settings.py
DATABASES = {
'default': {},
'primary': {
'NAME': 'primary',
'ENGINE': 'django.sql',
'HOST': 'xxxx',
'PORT': 'xxxx',
'USER': 'mysql_user',
'PASSWORD': 'spam',
},
'replica1': {
'NAME': 'replica1',
'ENGINE': 'django.sql',
'HOST': 'xxxx',
'PORT': 'xxxx',
'USER': 'mysql_user',
'PASSWORD': 'eggs',
},
'replica2': {
'NAME': 'replica2',
'ENGINE': 'django.sql',
'HOST': 'xxxx',
'PORT': 'xxxx',
'USER': 'mysql_user',
'PASSWORD': 'bacon',
},
}
我们还需要在 settings.py 添加我们⼿动编写的数据库路由Router。路由的作⽤是为数据库的读写制定规则。
DATABASE_ROUTERS = ['Project.database_router.PrimaryReplicaRouter']
注意: 主从数据库的同步是通过MySQL配置实现的,⽽不是Django实现的。Django只负责多个数据库的访问,不负责各个数据库的同步⼯作。如果你定义了多个路由,请⼀定注意路由的执⾏顺序。
第⼆步⾃定义数据库路由Router
在Django项⽬的根⽬录下创建 database_router.py ⽂件, 添加如下代码,⾃定义数据库路由。该路由规定了读取数据时将随机从replica1和replica2数据库中读取,⽽写⼊数据总是写⼊主数据库primary。该路由还允许三个数据库中的字段建⽴联系。
class PrimaryReplicaRouter(object):
def db_for_read(self, model, **hints):
"""
Reads go to a randomly-chosen replica.
"""
return random.choice(['replica1', 'replica2'])
def db_for_write(self, model, **hints):
"""
Writes always go to primary.
"""
return'primary'
def allow_relation(self, obj1, obj2, **hints):
"""
Relations between objects are allowed if both objects are
in the primary/replica pool.
"""
db_list = ('primary', 'replica1', 'replica2')
if obj1._state.db in db_list and obj2._state.db in db_list:
return True
return Nonedjango网站
def allow_migrate(self, db, app_label, model_name=None, **hints):
"""
All models end up in this pool.
"""
return True
⼀个数据库路由是⼀个类,这个类最多有四个⽅法:
db_for_read(model, **hints)
建议 model 对象进⾏读操作时使⽤的数据库。如果⼀个数据库操作可以提供对选择数据库有⽤的附加信息,那么可以通过 hints 字典提供。如果没有建议则返回 None 。
db_for_write(model, **hints)
建议 model 对象进⾏写操作时使⽤的数据库。如果⼀个数据库操作可以提供对选择数据库有⽤的附加信息,那么可以通过 hints 字典提供。如果没有建议则返回 None 。
allow_relation(obj1, obj2, **hints)
当 obj1 和 obj2 之间允许有关系时返回 True ,不允许时返回 False ,或者没有意见时返回 None 。这是
⼀个纯粹的验证操作,⽤于外键和多对多操作中,两个对象的关系是否被允许。
allow_migrate(db, app_label, model_name)
决定 model 是否可以和 db 为别名的数据库同步。如果可以返回True ,如果不可以返回 False ,或者没有意见时返回 None 。
Django项⽬按APP分库
在⼤型web项⽬中,我们常常会创建多个app来处理不同的业务,如果希望实现app之间的数据库分离,⽐如app01⾛数据库db1,app02⾛数据库
db2,⽽不是实现读写分离。我们可以定义如下所⽰的数据库路由, 然后将其加⼊settings.py 。
class AppDBRouter:
def db_for_read(self, model, **hints):
if model._meta.app_label == 'app01':
return'db1'
if model._meta.app_label == 'app02':
return'db2'
def db_for_write(self, model, **hints):
if model._meta.app_label == 'app01':
return'db1'
if model._meta.app_label == 'app02':
return'db2'
由于manage.py⼀次只能创建⼀个数据库,我们可以使⽤--database选项来依次创建我们需要的数据库。例如:
将app01下models中的表创建到db01的数据库”db1”中
python manage.py migrate --database=db1
将app02下models中的表创建到db02的数据库”db2”中
python manage.py migrate --database=db2
在使⽤多数据库时,我们可以使⽤using⽅法来⼿动选择需要读写的数据库,如下所⽰:
Aricle.objects.using('db1').all()
article_object.save(using='db2')
Django中使⽤多数据库注意事项:
django ⽬前不为跨多个数据库的外键关系(ForeinKey)或多对多关系提供任何⽀持。模型定义的任何外键和多对多关系字段都必须存在⼀个数据库内。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论