文章目录
外键简介
如果我们数据库使用的存储引擎为InnoDB,是支持外键约束的。外键的存在使得ORM框架在处理表关系的时候异常的强大。
修改表引擎
如果你发现你正在使用的引擎为MyISAM等不支持外键的引擎,可以在设置(setting.py)的数据库设置中指定使用的数据库存储引擎为InnoDB
DATABASES = {
'default': {
# 修改存储引擎
'OPTIONS': {
"init_command": "SET default_storage_engine=INNODB;"
}
}
}
连接外键
创建外键
连接外键需要用到.ForeignKey('连接表名', on_delete=删除方法)
方法
class Skill(models.Model):
技能号 = models.AutoField(primary_key=True)
技能名 = models.CharField(max_length=20)
技能介绍 = models.TextField()
class Meta:
db_table = '技能外键'
ordering = ['-技能号']
class Query(models.Model):
角色 = models.CharField(max_length=20)
介绍 = models.TextField()
创建时间 = models.DateTimeField(auto_now=True)
技能 = models.ForeignKey('Skill', on_delete=models.CASCADE)
如果外联需要连接自身时(多用于评论区二级评论等地),连接表名可以为self或自身类名。
外键删除操作
on_delete属性 | 作用 |
---|---|
CASCADE | 级联操作。如果外键对应的那条数据被删除了,那么这条数据也会被删除。 |
PROTECT | 受保护。即只要这条数据引用了外键的那条数据,那么就不能删除外键的那条数据。 |
SET_NULL | 设置为空。如果外键的那条数据被删除了,那么在本条数据上就将这个字段设置为空。如果设置这个选项,前提是要指定这个字段可以为空(添加null=True 属性)。 |
SET_DEFAULT | 设置默认值。如果外键的那条数据被删除了,那么本条数据上就将这个字段设置为默认值。如果设置这个选项,前提是要指定这个字段一个默认值。 |
SET() | 如果外键的那条数据被删除了。那么将会获取SET函数中的值来作为这个外键的值。SET函数可以接收一个可以调用的对象(比如函数或者方法),如果是可以调用的对象,那么会将这个对象调用后的结果作为值返回回去。 |
DO_NOTHING | 不采取任何行为。一切全看数据库级别的约束。 |
on_delete属性的删除时为Django中ORM模型中的操作,而数据库中删除时默认为RESTRICT,相当于PROTECT 属性。
外键的填入与查询
添加外键属性的时候和常规添加稍有不同,常规添加时候为ORM模型的类名(属性名)
,而添加外键属性的表头时候需要写为属性名_id
的形式
如下
角色 = Query(角色='非洲人', 介绍='我脸黑不说了', 技能_id=4)
角色.save()
或使用下列方式,在填写新外键的同时添加属性名
新增技能 = Skill(技能名='装萌', 技能介绍='宅男杀伤力max')
新增技能.save()
角色 = Query(角色='萝莉', 介绍='不喜欢我的都是异端')
角色.技能_id = 新增技能.技能号
角色.save()
查询外键时也较为简单,和常规查询方法类似,如下方.先找到指定数据,然后在.外键.外键属性名
即可
角色信息 = Query.objects.get(角色='萝莉')
print(角色信息.技能.技能名)
如果我们想要从外键指定的表中的数据查找被那些表的外键所绑定就需要用到使用表.外键表_str
方法如下
querys = Query.objects.all()
for query in querys:
print('\n角色:', query.角色)
members = query.member_set.all()
for member in members:
print('昵称:', member.昵称)