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 ...
随机推荐
- elasticsearch同步mongodb--mongo connector的使用
部署准备 python-3.6.4-amd64.exe mongodb-win32-x86_64-3.4.6-signed.msi (如果已经安装可以忽略) 注意点! 之前我写的一篇文章用的是ela ...
- chrome浏览器插件 Octotree 让你浏览GitHub的时候像IDE 一样提供项目目录
GitHub 作为代码托管平台,竟然没有提供项目目录,方便用户在线快速浏览项目结构.所以,在线分析项目源码就会变得很繁琐,必须一层一层点击,然后再一次一次地向上返回.要知道,本来 GitHub 网站在 ...
- 《杜增强讲Unity之Tanks坦克大战》11-游戏流程控制
11 游戏流程控制 使用协程来控制游戏流程 11.1 添加MessageText 首先添加一个Text来显示文字 image 设置GameMgr image 11.2 游戏整体流程 下面Gam ...
- 《Linux内核分析》第四周:扒开系统调用的三层皮
杨舒雯 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 " 一. 用户 ...
- Scalable Object Detection using Deep Neural Networks译文
原文:https://arxiv.org/abs/1312.2249
- linux 常用命令-ps(process state)
ps -ef | grep 端口号:查看某个端口的占用情况 ps -tunlp | grep 端口号:查看占用端口的进程名称
- python 安装多个包/pip用法
列出已安装的包 pip freeze or pip list 导出requirements.txt pip freeze > <目录>/requirements.txt 安装包 在线 ...
- ios UnitTest 学习笔记
一.运行第一个单元测试: 1.在Xcode 5中新建一个工程默认自带一个单元测试的文件夹,IDE自动生成了一个实现XCTestCase的.m文件,里面有一个失败测试(早期版本中实现的是SenTestC ...
- .net 开源组件推荐 之 StackExchange
已经两年没更新过博客了!!! StackExchange,地址:https://github.com/StackExchange,开源的这些项目都是在StackOverflow线上使用的. 说起Sta ...
- Windows下PyInstaller的使用教程
直接使用Python开发的软件时有许多不方便的地方,如需要安装特定的Python环境,需要安装依赖库.为了便于部署,需要将Python源代码编译成可执行文件,编译后的可执行文件就能脱离python环境 ...