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 ...
随机推荐
- effective c++ 笔记 (18-22)
//---------------------------15/04/06---------------------------- //#18 让接口容易被正确使用,不易被误用 { // 1:为了防 ...
- 回溯-uva129
题目链接:https://vjudge.net/problem/UVA-129 题解: 这道题卡了一会儿的时间,一开始最大的问题是如何判断添加了一个字符之后,该字符串是不是一个困难的串,解决办法是:利 ...
- Azkaban集群部署
一.部署模式 solo-server模式 (使用内置h2存储元数据): two-server模式 (1个webServer,1个execServer在同一服务器上,使用mysql存储元数据): mu ...
- [翻译]:Cinemachine 官方文档(0)
目录 Overview : Installation and Getting Started :安装并开始 User Guide :用户指南 What is Cinemachine? : 什么是Cin ...
- 第三次作业--导入excel表格(完整版)
031302322 031302316 将教师排课表导入系统 使用powerdesigner设计数据库表格 设计概念模型 打开new -> Conceptual Data Model创建概念模型 ...
- AD分辨率和精度区别
最近做了一块板子,当然考虑到元器件的选型了,由于指标中要求精度比较高,所以对于AD的选型很慎重.很多人对于精度和分辨率的概念不清楚,这里我做一下总结,希望大家不要混淆.我们搞电子开发的,经常跟“精度” ...
- 《当大数据遇见网络:大数据与SDN》
总体结构: <当大数据遇见网络:大数据与SDN> 摘要 大数据和SDN无论是对于学术界还是工业界来说都极具吸引力.传统上人们都是分别在最前沿工作中研究这两个重要的领域.然而一方面,SDN的 ...
- Windows 下 Docker 的简单学习使用过程之三 创建images 导出images
1. 创建images 主要有两种方法, 一种是docker commit 一种是docker build 其中有一个很明显的区别: docker commit 是将运行状态的虚拟机 进行 生成ima ...
- PHP4个载入语句的区别
4个载入语句的区别 include和require的区别: include载入文件失败时(即没有找到该文件),报一个“提示错误”,然后继续执行后续代码: requre载入文件失败时,报错并立即终止执行 ...
- 使用 TListView 控件(4)
本例效果图: 代码文件: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, ...