python---django中orm的使用(4)字段,参数(on_delete重点)补充,一对多,一对一,多对多
1.索引:
普通索引:加快查找速度
唯一索引:加快查找速度,唯一约束
主键索引:加快查找速度,唯一索引,不为空
class UserInfo(models.Model): username = models.CharField(
null=False, #不允许为空
db_column='user', #自定义列名,可以修改再数据库中的列名
max_length=,
db_index=True, #普通索引,只能加速查找
# unique=True, #约束索引,加速查找,唯一约束
# primary=True, #主键索引,加速查找,唯一约束,不为空
)
gender = models.BooleanField(
default=True #设置默认值
)
元类使用:
用于生成联合索引,以及设置个别参数
#元类信息
class Meta:
# 数据库中生成的表名称 默认 app名称 + 下划线 + 类名
db_table = "app01_un"
# 联合索引
# index_together = [
# ("username", "gender"),
# ]
# 联合唯一索引
unique_together = (("username", "gender"),)
#IntegrityError: columns user, gender are not unique
# admin中显示的表名称
verbose_name = "用户信息"
2.一对多外键建立:
el = models.ForeignKey(
to="EmailInfo", #关联表
to_field='id', #关联列名
db_constraint=True #是否在数据库该表中创建外键约束(外键功能查找等依旧存在,但是不具有约束功能) 比如:有约束时,邮箱id1-10,那么在该表中el也会是1-10,但是当false时,该el设置可以是任意,不受关联表的约束
limit_choices_to=None, #在Admin或者ModelForm中显示数据时,提供限制后的数据展示
--limit_choices_to={'id_gt':5}
--limit_choices_to=lambda:{'id_gt':5}#或者lambda表达式
)
class EmailInfo(models.Model):
email = models.EmailField(
null=False,
db_index=True,
unique=True,
)
外键关联表EmailInfo
添加信息:
#添加信息
UserInfo.objects.create(
username="张三",
gender=True,
el_id=
)
UserInfo.objects.create(
username="李四",
gender=True,
el_id=
)
#因为唯一约束,是对姓名,性别一起约束,所以当不同时,是可以进行添加的
UserInfo.objects.create(
username="王五",
gender=False,
el_id=3
)
UserInfo.objects.create(
username="王五",
gender=True,
el_id=3
)
UserInfo.objects.create(
username="赵六",
gender=True,
el_id=
) EmailInfo.objects.create(**{'email': '46412454@qq.com'})
EmailInfo.objects.create(**{'email': '4641245454@qq.com'})
EmailInfo.objects.create(**{'email': '46412fwa454@qq.com'})
对于外键,删除是是默认为级联删除,当删除一个,对应相关数据也会被删除,所以,我们有时候需要修改这一性质,在创建外键是使用on_delete即可
对于on_delete的几种设置:
def set_test():
return
el = models.ForeignKey(
to="EmailInfo", #关联表
to_field='id', #关联列名
null=True,
default=,
#删除自己数据,对于被关联方,一点影响都没有 #on_delete=None, #当关联的email数据被删除时候,该数据也会被删除,不存在
#on_delete=models.CASCADE, #性质和None一样是默认删除
#on_delete=models.DO_NOTHING, #当关联的数据被删除时,自己不受影响,什么事都不做,不会报错
#on_delete=models.PROTECT, #关联保护,因为邮箱数据被用户表关联,所以该邮箱不允许被删除,并且触发ProtectError
#Cannot delete some instances of model 'EmailInfo' because they are referenced through a protected foreign key: 'UserInfo.el'", <QuerySet [<UserInfo: UserInfo object>]>
#on_delete=models.SET_NULL, #删除关联数据,自己被设置为null(前提字段需要设置为可空null=True)
#对于测试models.SET_NULL时,我们需要先了解,对于数据库的基本字段设置,像null,max_length这些属性,我们需要重新去生成数据表,
#对于on_delete等Django中的附属属性,我们可以动态修改,不需要重新生成数据表,所以如果我们开始并没有设置null=True(默认false),我们需要去重新生成数据表 #on_delete=models.SET_DEFAULT,#删除关联数据后,会将自己的数据设置为默认值,需要设置default属性
#on_delete=models.SET(3) #和SET_DEFAULT相似,只不过不需要设置默认值,在SET()中可以直接设置
on_delete=models.SET(set_test) #和SET一样,只不过值设为了回调函数,需要将函数设为全局,可调用
)
3.一对一:与一对多外键属性几乎一致,只是在unique上多加了true。两种实现:o和o1
class User(models.Model):
username = models.CharField(
max_length=,
db_index=True,
) class Tag(models.Model):
title = models.CharField(
max_length=,
) o = models.OneToOneField(
to='User',
to_field='id',
on_delete=None,
###### 对于一对一 ######
# 1. 一对一其实就是 一对多 + 唯一索引
# 2.当两个类之间有继承关系时,默认会创建一个一对一字段
# 如下会在A表中额外增加一个c_ptr_id列且唯一:
)
o1 = models.ForeignKey(
to='User',
to_field='id',
on_delete=None,
unique=True,
)
4.多对多ManyToManyField
class User(models.Model):
username = models.CharField(
max_length=,
db_index=True,
) def __str__(self):
return self.username class Tag(models.Model):
title = models.CharField(
max_length=,
) # m = models.ManyToManyField(to="User")
# 使用ManyToManyField只能在第三张表中创建3列数据id(主键自增),外键1_id,外键2_id
# m = models.ManyToManyField(
# to="User",
# related_name="tag", #反向查询是设置的字段名,替换(表名_set)默认是表名_set,这里设置后就可以简化了
# related_query_name="tg", #反向查询是用于替换(表名)
# limit_choices_to=None, #在admin中或者modelform中进行限制字段
# db_constraint=True #同外键约束一致
# ) def __str__(self):
return self.title
自定义第三张表(查询方便):
#自定义第三张表
class UserToTag(models.Model):
nid = models.AutoField(
primary_key=True
) u = models.ForeignKey(to="User")
t = models.ForeignKey(to="Tag") ctime = models.DateField() #ManyToManyField中含有联合唯一
class Meta:
#联合唯一
unique_together=[
('u', 't'),
]
补充:through,through_fields.
django除了能自动创建多对多的第三张表,同样也可以自定义创建多对多的第三张表,而且操作和管理扩展等难易程度要比自动创建的好许多。所以,在之后的models表结构中,推荐使用自定义的方式。并且加上through和through_fields
class User(models.Model):
username = models.CharField(
max_length=,
db_index=True
)class Tag(models.Model):
title = models.CharField(
max_length=,
db_index=True,
) members = models.ManyToManyField(
User,
through='UserToTag',
through_fields=('u','t'),
)
class UserToTag(models.Model):
u = models.ForeignKey(
User,
on_delete=models.CASCADE
) t = models.ForeignKey(
Tag,
on_delete=models.CASCADE
)
操作:
models.UserToTag.objects.create(
u=models.User.objects.get(id=),
t=models.Tag.objects.get(id=)
)
其他添加方法看:python---django中orm的使用(1)
5.多对多---自查询:
class User(models.Model):
username = models.CharField(
max_length=,
db_index=True
)
# 自关联(互粉操作),反向操作容易乱(各个表对他的反向操作都是User_set),最好加上related_name,以后最好都加上related_name
# d = models.ManyToManyField("User",related_name='b')
python---django中orm的使用(4)字段,参数(on_delete重点)补充,一对多,一对一,多对多的更多相关文章
- Django中ORM介绍和字段及其参数
ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述 ...
- Django中ORM介绍和字段及字段参数 Object Relational Mapping(ORM)
Django中ORM介绍和字段及字段参数 Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简 ...
- 6月20日 Django中ORM介绍和字段、字段参数、相关操作
一.Django中ORM介绍和字段及字段参数 二.Django ORM 常用字段和参数 三.Django ORM执行原生SQL.在Python脚本中调用Django环境.Django终端打印SQL语句 ...
- Django中ORM的使用
Django中ORM的使用 ORM orm(object-relation-mapping)对象关系映射,即用对象来表示关系数据库中的表: 类 --> 表, 对象-->一行数据 对象的属性 ...
- Django中ORM对数据库的增删改查
Django中ORM对数据库数据的增删改查 模板语言 {% for line in press %} {% line.name %} {% endfor %} {% if 条件 %}{% else % ...
- Django 中ORM 的使用
一:Django 中 orm 的使用 1:手动新建一个数据库 2 :告诉Django连接哪个数据库 settings.py里配置数据库连接信息: #数据库相关的配置项 DATABASES ={ 'de ...
- 关于Django中ORM数据库迁移的配置
Django中ORM数据库迁移配置 1,若想将模型转为mysql数据库中的表,需要在settings中配置: DATABASES = { 'default': { 'ENGINE': 'django. ...
- Django中ORM创建表关系
一:django中ORM创建表关系 ORM创建外键关系 1.表与表之间的关系 1.表与表之间的关系 一对多 一对一 多对多 2.操作目标条件: 图书表 出版社表 作者表 作者详情表 3.外键关联 一对 ...
- Django中ORM实际应用
1. Django中ORM的使用 1. 手动新建一个数据库 2. 告诉Django连接哪个数据库 settings.py里面配置数据库连接信息: # 数据库相关的配置项 DATABASES = { ' ...
- Python Django中QQ邮箱授权码问题
Python Django中QQ邮箱授权码问题 系统及软件版本如下: Ubuntu Kylin 16.04 Python 3.5.1 Django 1.9.7 PyCharm Community Ed ...
随机推荐
- 把Excel的数据导入到数据库
将Excel作为数据源,将数据导入数据库,是SSIS的一个简单的应用,下图是示例Excel,数据列是code和name 第一部分,Excel中的数据类型是数值类型 1,使用SSDT创建一个packag ...
- Loadrunner 面试常见问题
三大组件: 脚本生成器,录制和调试脚本 . 控制台,设置运行和资源场景 结果分析器,将测试结果数据以不同的图表呈现,便于性能分析 工作原理: 录制:根据不同协议,记录下客户端和服务器二者之间的对话,生 ...
- 菜鸟凉经(华为、firehome、大华)
面试通知都是前一天来的,准备的时间很少,所以表现也不是特别满意,来看面经吧: 华为一面(IT应用工程师): 1.自我介绍:(华为面试都是1对1,面前的是个温柔的小哥,挺放松的) 2.你主要会的it技术 ...
- VGGNet论文翻译-Very Deep Convolutional Networks for Large-Scale Image Recognition
Very Deep Convolutional Networks for Large-Scale Image Recognition Karen Simonyan[‡] & Andrew Zi ...
- Fragment 使用总结
1. 要深刻理解Fragment 的生命周期 2. Fragment.getActivity()并不能保证非空. 3.如果在Fragment中有异步的回调, 特别要注意此时Fragment 是否还at ...
- 制作R中分词的字典的办法
在开始下面步骤之前先让自己的文件可以显示扩展名. 如何显示请谷歌. 第一步:打开一个文本文件 第二步:把你要的词复制到这个文本文件吧. 第三步:将这个文本文件的格式改为dic.即原来文件格式是txt后 ...
- node 随便升级到最新版本的遭遇
将node 升级到最新版本后,创建一个RN新项目,执行:react-native init AwesomeProject 遇到: error An unexpected error occurred ...
- LINUX基础实验报告
实验一:主要是介绍Linux系统概况,无运行代码. 实验二:Linux的基本操作 重要知识点 [Tab] 使用Tab键来进行命令补全,Tab键一般键盘是在字母Q旁边,这个技巧给你带来的最大的好处就是当 ...
- Inside the Social Network’s (Datacenter) Network
摘要: 大量服务提供商投资越来越多的更大数据中心来保证基础计算需求以支持他们的服务.因此,研究人员和行业从业者都集中了大量的努力设计网络结构有效互连和管理流量以保证这些数据中心的性能.不幸的是,数据中 ...
- FPGA---Basys3(实验内容汇总贴)
前言 本博文为FPGA---Basys3入门板的实验汇总帖子. 实验指导书 实验源码github地址 实验目录 组合逻辑电路设计 编码器 比较器 全加器 时序逻辑电路设计 D 触发器的实现 同步复位的 ...