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重点)补充,一对多,一对一,多对多的更多相关文章

  1. Django中ORM介绍和字段及其参数

    ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述 ...

  2. Django中ORM介绍和字段及字段参数 Object Relational Mapping(ORM)

    Django中ORM介绍和字段及字段参数   Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简 ...

  3. 6月20日 Django中ORM介绍和字段、字段参数、相关操作

    一.Django中ORM介绍和字段及字段参数 二.Django ORM 常用字段和参数 三.Django ORM执行原生SQL.在Python脚本中调用Django环境.Django终端打印SQL语句 ...

  4. Django中ORM的使用

    Django中ORM的使用 ORM orm(object-relation-mapping)对象关系映射,即用对象来表示关系数据库中的表: 类 --> 表, 对象-->一行数据 对象的属性 ...

  5. Django中ORM对数据库的增删改查

    Django中ORM对数据库数据的增删改查 模板语言 {% for line in press %} {% line.name %} {% endfor %} {% if 条件 %}{% else % ...

  6. Django 中ORM 的使用

    一:Django 中 orm 的使用 1:手动新建一个数据库 2 :告诉Django连接哪个数据库 settings.py里配置数据库连接信息: #数据库相关的配置项 DATABASES ={ 'de ...

  7. 关于Django中ORM数据库迁移的配置

    Django中ORM数据库迁移配置 1,若想将模型转为mysql数据库中的表,需要在settings中配置: DATABASES = { 'default': { 'ENGINE': 'django. ...

  8. Django中ORM创建表关系

    一:django中ORM创建表关系 ORM创建外键关系 1.表与表之间的关系 1.表与表之间的关系 一对多 一对一 多对多 2.操作目标条件: 图书表 出版社表 作者表 作者详情表 3.外键关联 一对 ...

  9. Django中ORM实际应用

    1. Django中ORM的使用 1. 手动新建一个数据库 2. 告诉Django连接哪个数据库 settings.py里面配置数据库连接信息: # 数据库相关的配置项 DATABASES = { ' ...

  10. Python Django中QQ邮箱授权码问题

    Python Django中QQ邮箱授权码问题 系统及软件版本如下: Ubuntu Kylin 16.04 Python 3.5.1 Django 1.9.7 PyCharm Community Ed ...

随机推荐

  1. JavaScript快速入门-ECMAScript语句

    JavaScript语句(if.for.for in.do...while.while.break.continue.switch) 一.if语句 if (condition) statement1 ...

  2. 机器学习英雄访谈录之 DL 自由职业者:Tuatini Godard

    目录 机器学习英雄访谈录之 DL 自由职业者:Tuatini Godard 正文 对我的启发 机器学习英雄访谈录之 DL 自由职业者:Tuatini Godard Sanyam Bhutani 是 M ...

  3. Cloud Native Weekly | KubeCon首登中国,华为云亮相KubeCon 2018,微软云服务又罢工

    1.KubeCon首登中国,Kubernetes将如何再演进? 11月14日,由CNCF发起的云原生领域全球最大的峰会之一KubeCon+CloudNativeCon首次登陆中国,中国已经成为云原生领 ...

  4. C++ 派生类成员的访问属性

    派生类成员的访问属性: C++继承方式总共分为以下几种:public.private.protected三种(它们直接影响到派生类的成员.及其对象对基类成员访问的规则).(1)public(公有继承) ...

  5. 《Linux内核设计与实现》第五章读书笔记

    第五章  系统调用 5.1与内核通信 1. 系统调用 让应用程序受限的访问硬件设备 提供创建新进程并与已有进程通信的机制 提供申请操作系统其他资源能力是用户空间进程和硬件设备之间的中间层 2. 系统调 ...

  6. idea 使用 mybaits generator

    Intellij IDEA 14 作为JavaIDE 神器,接触后发现,非常好用,对它爱不释手,打算离开eclipse和myeclipse,投入Intellij IDEA的怀抱. 然而在使用的过程中会 ...

  7. SQL基本概念

    目录 什么是SQL? DDL(Data Definition Language,数据定义语言) 创建数据库(CREATE) 创建表(CREATE) 删除表(DROP) 更新表(ALTER) DML(D ...

  8. fetch API & upload file

    fetch API & upload file https://github.com/github/fetch/issues/89 https://stackoverflow.com/ques ...

  9. 【JavaService】使用Java编写部署windows服务

    如果你玩windows系统,你对服务这个东西并不会陌生,服务可以帮我们做很多事情,在不影响用户正常工作的情况下,可以完成很多我们需要的需求. 众所周知,微软的visio studio内置的Servic ...

  10. java通过dom读写xml文件

    java通过dom读写xml文件 要读的xml文件 <?xml version="1.0" encoding="GB2312"?><学生花名册 ...