百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

django 2 笔记之models 字段关系(5)

toyiye 2024-06-30 09:40 11 浏览 0 评论

字段关系

OneToOneField(一对一)

ForeignKey(一对多)

ManyToManyField(多对多)


models表设计基本原则:

  1. 一对一的表,两表的属性实际上完全可以合并成一个表,共用一个主键即可;
  2. 一对多的表,可以设中间关联表,也可以将关联表并入“多”这头;若设独立关联表,则可引入“多”这头的主键作为其主键,也可另立主键并将“一”和“多”两表的主键作为关联表的外键;
  3. 多对多的表,则必须设中间关联表,关联表设独立主键,并引入两个“多”头的表的主键作为关联表的外键。
  4. 能用1对1的,就不用1对多;能用1对多的,就不用多对多,往简单化方向靠;
  5. 能当属性处理的,尽量当属性,而不是当实体处理去另立新表,这样可使问题简化。
  6. 把意义相近联系紧密的属性放在一张表内,而不是拆在多张表中。

OneToOneField(一对一)

  • model数据字段,最重要的就是设置外键
  • 类似于继承,在设计模型时,可以将多个数据路中共有的字段集中起来,然后使用OneToOne,进行关联。
  • 反向关联的对象只有一个,多数用于从一个模型扩展出另一个模型的情况。

一对一通过子对象访问关联的主对象:

<子对象>.<一对一键>

一对一通过主对象访问关联的子对象:

<主对象>.<小写子模型名>

注意:返回的是单个对象而不是集合

代码:

# 员工基本信息类和详细信息类是一对一的关系
# 员工基本信息类
class EmployeeBasicInfo(models.Model):
 # 姓名
 name = models.CharField(max_length=20)
 # 关联属性,代表员工的详细信息
 employee_detail = models.OneToOneField('EmployeeDetailInfo') # 定义在基本信息类或详细信息类中都可以。 
# 员工详细信息类
class EmployeeDetailInfo(models.Model):
 # 联系地址
 addr = models.CharField(max_length=256)
 # 关联属性,代表员工基本信息
 # employee_basic = models.OneToOneField('EmployeeBasicInfo') # 定义在基本信息类或详细信息类中都可以。

ForeignKey(一对多)

多对一关系由外键实现,外键要定义在“多”的一方,如:

models.ForeignKey

(<主表>, ...)

如果要关联的主表在另一个app中,要显式的指出:

models.ForeignKey(’<app名称>.<主表>‘, ...)


可创建自己关联自己的外键——比如,在学科信息表中,学科分类可被多次引用并对应学科信息:

#创建学科分类表

class Type(models.Model):

id = models.AutoField(primary_key=True)

type_name = models.CharField(max_length=20)

#创建学科信息表

class Product(models.Model):

id = models.AutoField(primary_key=True)

name = models.CharField(max_length=60)

weight = models.CharField(max_length=20)

size = models.CharField(max_length=20)

type = models.ForeignKey(Type,on_delete=models.CASCADE()) # 表示外键关联到Type表.


如果在子模型中存在多个外键指向同一个主模型,必须给他们加上不同的related_name,用于反向查询。

外键字段在数据库中的列名是<外键名>_id,用来储存主表对象的id,因此,在得到主表id的情况下可以不调用外键而直接筛选:

QuerySet = <外键表>.filter(<外键名>_id=<主表id>)#获得与“<主表id>=xxx的主对象”相关联的子对象

多对一的字段参数

on_delete=models.XXX当主对象被删除时,关联的子对象的操作(因为主键不能随意删除,外键可以直接删除)

models.CASCADE:同时删除关联的子对象,Django模拟SQL约束ON DELETE CASCADE的行为,并删除包含ForeignKey的对象

models.PROTECT:阻止CASCADE删除关联的子对象,并弹出ProtectedError异常

models.SET_NULL:将子对象的外键字段设为null(外键字段需设置null=True)

models.SET_DEFAULT:将子对象的外键字段设为默认值(外键字段需设置default=’xxx’)

models.DO_NOTHING:什么也不做。如果数据库后端强制执行参照完整性,则这将导致IntegrityError除非您手动将SQL约束添加到数据库字段。

models.SET():设置为一个传递给SET()的值或一个回调函数的返回值

注:on_delete是Django2.0之后新增的必选项。

related_name=’ ‘通过主对象反向引用子对象的通道名称,默认名称是<小写子模型名>_set。

如:class Car(models.Model):

factory = models.ForeignKey(Factory, on_delete=models.CASCADE, related_name='car_by_factory',)

此时Factory主表取出所有关联的Car对象:factory.car_by_factory.all()如果不想给外键设置反向关联名称,就用related_name=’+’或以+号结尾

related_query_name=’ ‘

主对象反向关联查询的名称,默认查询名称是<外键列>__<主表的某列>。

如:class Tag(models.Model):

article = models.ForeignKey(Article, on_delete=models.CASCADE, related_query_name="tag", )

name = models.CharField(max_length=255)

此时用tag作为查询名称:

Article.objects.filter(tag__name="A")limit_choices_to={}

限制外键能关联的对象,用于Django的表单模块和admin后台,可以传入字典、Q对象、一个返回字典或Q对象的函数。

如:

staff_member = models.ForeignKey( User, on_delete=models.CASCADE, limit_choices_to={'is_staff': True},)

此时,表单模块的staff_member字段列表中只会出现is_staff=True的Users对象,对admin后台非常有用。

to_field=’ ‘

让外键关联到指定的字段上(默认关联到主键),该字段必须有unique=True属性。


ManyToManyField(多对多)

下章在写...

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码