一、外键ForeignKey

1、字段参数
1.to
设置要关联的表 2.to_field
设置要关联的表的字段(一般不设置,默认使用主键id关联) 3.related_name
反向操作时,使用的字段名,用于代替原反向查询时的'表名_set' 4.related_query_name
反向查询操作时,使用的连接前缀,用于替换表名 5.on_delete
当删除关联表中的数据时,当前表与其关联的行的行为。 1.models.CASCADE
删除关联数据,与之关联的数据也删除(on_delete=models.CASCADE) 2.抛出异常(错误)
1.models.DO_NOTHING
删除关联数据,引发错误IntegrityError 2.models.PROTECT
删除关联数据,引发错误ProtectedError 3.models.SET_NULL
删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空) 4.models.SET_DEFAULT
删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值) 5.models.SET
删除关联数据
a. 与之关联的值设置为指定值,设置:models.SET(值)
b. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象) 6.db_constraint
是否在数据库中创建外键约束,默认为True。

二、OneToOneField(一对一)

1、通常一对一字段用来扩展已有字段。(跟ForeignKey一样,生成的字段,默认会加上_id)

2、字段参数
1.to
设置要关联的表。 2.to_field
设置要关联的字段。 3.related_name
反向操作时,使用的字段名,用于代替原反向查询时的'表名_set' 4.on_delete
同ForeignKey字段。

三、ManyToManyField

1、用于表示多对多的关联关系。在数据库中通过第三张表来建立关联关系。

2、字段参数
1.to
设置要关联的表 2.related_name
同ForeignKey字段(反向操作时,使用的字段名,用于代替原反向查询时的'表名_set') 3.related_query_name
同ForeignKey字段(反向查询操作时,使用的连接前缀,用于替换表名) 4.symmetrical
仅用于多对多自关联时,指定内部是否创建反向操作的字段。默认为True。
举个例子:
class Person(models.Model):
name = models.CharField(max_length=16)
friends = models.ManyToManyField("self")
此时,person对象就没有person_set属性。 class Person(models.Model):
name = models.CharField(max_length=16)
friends = models.ManyToManyField("self", symmetrical=False)
此时,person对象现在就可以使用person_set属性进行反向查询。 5.through
在使用ManyToManyField字段时,Django将自动生成一张表来管理多对多的关联关系。
但我们也可以手动创建第三张表来管理多对多关系,此时就需要通过through来指定第三张表的表名。 6.through_fields
设置关联的字段。 7.db_table
默认创建第三张表时,数据库中表的名称。 3、多对多的三种创建方式
1. 自己建立第三张关系表,外键分别关联两个表
1. 优点
1. 可以扩充第三张关系标的字段
2. 缺点
1. 自己做连表查询
3. 建表例子
class Book(models.Model):
title = models.CharField(max_length=12) class Author(models.Model):
name = models.CharField(max_length=12) # 1. 多对多第一种创建方式:自己创建第三张关系表
class Author2Book(models.Model):
id = models.AutoField(primary_key=True)
author_id = models.ForeignKey(to='Author')
book_id = models.ForeignKey(to='Book')
price = models.IntegerField() # 可以自己扩充需要的字段 2. 通过ORM内置的ManyToManyField,自动创建第三张关系表
1. 优点
1. 提供了很多连表操作的快捷方法--> all(), add(), set(), clear(), remove()
2. 缺点
1. 无法扩展第三张关系表
3. 建表例子
class Book(models.Model):
title = models.CharField(max_length=12) class Author(models.Model):
name = models.CharField(max_length=12)
books = models.ManyToManyField(to='Book') # 字段就这些,无法扩充其他字段 3. 自己创建第三张关系表,通过ManyToManyField关联
1. 优点:
1. 既能够使用多对多查询的快捷方法all()(只能用all,不能使用add,set等),还能够自己扩展第三张关系表的字段
2. 建表例子
class Book(models.Model):
title = models.CharField(max_length=12) class Author(models.Model):
name = models.CharField(max_length=12)
# 告诉ManyToManyField通过(through)Author2Book这张表进行关联,不使用ORM自动创建的第三张表,而是使用我自己创建的表
# through_fields告诉ORM通过哪几个字段进行多对多关联
books = models.ManyToManyField(to='Book', through='Author2Book', through_fields=('author', 'book')) # 1. 多对多第三种创建方式:自己创建第三张关系表,此时外键不需要添加_id了,因为ORM会默认帮你在外键后面加_id
class Author2Book(models.Model):
id = models.AutoField(primary_key=True)
author = models.ForeignKey(to='Author')
book = models.ForeignKey(to='Book')
price = models.IntegerField(null=True) # author_id和book_id要联合唯一
class Meta:
unique_together = (('author', 'book'),)
3. 操作例子
# 多对多的第三张方式也支持all查询
author_obj = Author.objects.first()
# 第一个作者的所有书籍
ret = author_obj.books.all() # 给第一个作者添加一本书
# author_obj.books.add(4) # 报错
Author2Book.objects.create(author_id=1, book_id=4)

四、元信息

1、ORM对应的类里面包含另一个Meta类,而Meta类封装了一些数据库的信息。主要字段如下:

2、元类属性
1.db_table
ORM在数据库中的表名默认是 app_类名,可以通过db_table可以重写表名。 2.index_together
联合索引。 3.unique_together
联合唯一索引。 4.ordering
指定默认按什么字段排序。
只有设置了该属性,我们查询到的结果才可以被reverse()。

ORM基础之字段及其参数介绍的更多相关文章

  1. ORM基础2 字段及其参数和meta

    一.ORM简介 1.概念:ORM(Object Relational Mappingt ),对象关系映射 2.实质:类与数据库之间的映射 3.优点: 开发人员不用写数据库 4.缺点: 开发人员,数据库 ...

  2. day07 ORM中常用字段和参数

    day07 ORM中常用字段和参数 今日内容 常用字段 关联字段 测试环境准备 查询关键字 查看ORM内部SQL语句 神奇的双下划线查询 多表查询前提准备 常用字段 字段类型 AutoField in ...

  3. ORM中聚合函数、分组查询、Django开启事务、ORM中常用字段及参数、数据库查询优化

    聚合函数 名称 作用 Max() 最大值 Min() 最小值 Sum() 求和 Count() 计数 Avg() 平均值 关键字: aggregate 聚合查询通常都是配合分组一起使用的 关于数据库的 ...

  4. Django ORM中常用字段和参数

    一些说明: 表myapp_person的名称是自动生成的,如果你要自定义表名,需要在model的Meta类中指定 db_table 参数,强烈建议使用小写表名,特别是使用MySQL作为后端数据库时. ...

  5. Django --ORM常用的字段和参数 多对多创建形式

    1 ORM字段 AutoField int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建一个列名为id的列. IntegerField 一个整数类型 ...

  6. Django ORM常用的字段和参数

    ORM 常用字段 AutoField int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建一个列名为id的列. IntegerField 一个整数类 ...

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

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

  8. Django中的ORM介绍,字段以及字段的参数。

    Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据 ...

  9. django orm介绍以及字段和参数

    Object Relational Mapping (ORM) orm介绍 orm概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数 ...

随机推荐

  1. CSS Grid 布局完全指南(图解 Grid 详细教程)

    CSS Grid 布局是 CSS 中最强大的布局系统.与 flexbox 的一维布局系统不同,CSS Grid 布局是一个二维布局系统,也就意味着它可以同时处理列和行.通过将 CSS 规则应用于 父元 ...

  2. vue 获取页面详情后 切换页面时 如何监听用户是否修改过信息

    可以用 beforeRouteLeave 和 updated 来判断.export default { name: 'supplier', components:{cmtWrap,cmtContent ...

  3. TS学习随笔(四)->数组的类型

    少侠们,今天我们继续来搞一搞TS 今天我们要来看一看TS中数组的定义是个什么鬼样子 数组的类型: 在 TypeScript 中,数组类型有多种定义方式,比较灵活.下面我们来看看有哪些定义方法 「类型 ...

  4. arcgis api 3.x for js 入门开发系列六地图分屏对比(附源码下载)

    前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...

  5. 彻底关闭Excle进程的几个方法

    之前研究过的问题,最近有朋友问,这里再总结下做一个笔记. 我们在应用程序里面通过创建Excle应用对象打开Excle的情况下,如果不注意几个问题,可能无法彻底关闭Excle进程,来考察下面的几种情况: ...

  6. spring学习总结——装配Bean学习四(导入和混合配置)

    情景:在典型的Spring应用中,我们可能会同时使用自动化和显式配置(JavaConfig)或者XML配置,幸好在Spring中,这些配置方案都不是互斥的.你尽可以将JavaConfig的组件扫描和自 ...

  7. (转)聊聊Greenplum的那些事

    开卷有益——作者的话 有时候真的感叹人生岁月匆匆,特别是当一个IT人沉浸于某个技术领域十来年后,蓦然回首,总有说不出的万千感慨. 笔者有幸从04年就开始从事大规模数据计算的相关工作,08年作为Gree ...

  8. Linux分页机制之分页机制的实现详解--Linux内存管理(八)

    1 linux的分页机制 1.1 四级分页机制 前面我们提到Linux内核仅使用了较少的分段机制,但是却对分页机制的依赖性很强,其使用一种适合32位和64位结构的通用分页模型,该模型使用四级分页机制, ...

  9. Win10 - MySQL 10061 错误

    Win10 - MySQL 10061 错误 报错内容为: Can't connect to MySQL server on localhost (10061) 参考 : MySQL问题记录--Can ...

  10. 比较两个slice、struct或者map是否相等

    我们可以直接使用reflect.DeepEqual来比较两个slice.struct或者map是否相等 package main import ( "fmt" "refl ...