django中orm模型类多种用法

模型准确且唯一的描述了数据。它包含您储存的数据的重要字段和行为。一般来说,每一个模型都映射一张数据库表。

  • 每个模型都是一个 Python 的类,这些类继承 django.db.models.Model
  • 模型类的每个属性都相当于一个数据库的字段。
  • 利用这些,Django 提供了一个自动生成访问数据库的 API;

字段类型

模型中每一个字段都应该是某个 Field 类的实例, Django 利用这些字段类来实现以下功能:

  • 字段类型用以指定数据库数据类型(如:INTEGER, VARCHAR, TEXT)。
  • 在渲染表单字段时默认使用的 HTML 视图 (如: , )。
  • 基本的有效性验证功能,用于 Django 后台和自动生成的表单。
字段描述
AutoField一个 IntegerField,根据可用的 ID 自动递增
BigAutoField一个 64 位整数,与 AutoField 很相似,但保证适合 1 到 9223372036854775807 的数字
BooleanField一个 true/false 字段。该字段的默认表单部件是 CheckboxInput,或者如果 null=True 则是 NullBooleanSelect。当 Field.default 没有定义时,BooleanField 的默认值是 None。
CharField一个字符串字段,适用于小到大的字符串。对于大量的文本,使用 TextField CharField 有两个额外的参数:CharField.max_length(必须的。该字段的最大长度)、CharField.db_collation(可选的。该字段的数据库字符序名称)
DateField一个日期,在 Python 中用一个 datetime.date 实例表示 可选参数auto_now(每次保存对象时,自动将该字段设置为现在)、auto_now_add(当第一次创建对象时,自动将该字段设置为现在)

详见:django官方文档–字段类型

字段选项

以下只介绍Field类中的选项,拓展类每个都有独特的选项,详细参考Django文档中每个类别的详细介绍(例如, CharField (以及它的子类)需要接收一个 max_length 参数,用以指定数据库存储 VARCHAR 数据时用的字节数。)

选型描述
null如果设置为 True,当该字段为空时,Django 会将数据库中该字段设置为 NULL。默认为 False 。
blank如果设置为 True,该字段允许为空。默认为 False。
choices一系列二元组,用作此字段的选项 CHOICES = [(‘FR’, ‘Freshman’),(‘SO’, ‘Sophomore’),]
default该字段的默认值
help_text额外的“帮助”文本,随表单控件一同显示。
primary_key如果设置为 True ,将该字段设置为该模型的主键
unique如果设置为 True,这个字段的值必须在整个表中保持唯一

除了 ForeignKey, ManyToManyField 和 OneToOneField,任何字段类型都接收一个可选的位置参数 verbose_name,如果未指定该参数值, Django 会自动使用字段的属性名作为该参数值,并且把下划线转换为空格。

关联关系

显然,关系型数据库的强大之处在于各表之间的关联关系。 Django 提供了定义三种最常见的数据库关联关系的方法:多对一,多对多,一对一。

多对一关联

class ForeignKey(to, on_delete, **options)

一个多对一的关系。需要两个位置参数:模型相关的类和 on_delete 选项。

如果需要创建一个递归关系—— 一个与自己有多对一关系的对象

使用 models.ForeignKey(‘self’,on_delete=models.CASCADE)。

如果你需要在一个尚未定义的模型上创建关系,你可以使用模型的名称,而不是模型对象本身:

例如,如果一个 Car 模型有一个制造者 Manufacturer --就是说一个 Manufacturer
制造许多辆车,但是每辆车都仅有一个制造者-- 那么使用下面的方法定义这个关系:


from django.db import modelsclass Manufacturer(models.Model):# ...passclass Car(models.Model):manufacturer = models.ForeignKey(Manufacturer, on_delete=models.CASCADE)# ...
on_delete参数设置

当一个由 ForeignKey 引用的对象被删除时,Django 将模拟 on_delete 参数所指定的 SQL 约束的行为。

  • CASCADE
manufacturer = models.ForeignKey(Manufacturer, on_delete=models.RESTRICT)

级联删除。Django 模拟了 SQL 约束 ON DELETE CASCADE 的行为,也删除了包含 ForeignKey 的对象

Model.delete() 在相关的模型上没有被调用,但是 pre_delete 和 post_delete 信号是为所有被删除的对象发送的。

  • PROTECT
manufacturer = models.ForeignKey(Manufacturer, on_delete=models.PROTECT)

通过引发 ProtectedError错误,即 django.db.IntegrityError 的子类,防止删除被引用对象。

  • RESTRICT
manufacturer = models.ForeignKey(Manufacturer, on_delete=models.RESTRICT)

这个在Django 3.1.以上版本使用

通过引发 RestrictedError错误 ( django.db.IntegrityError 的一个子类)来防止删除被引用的对象。与 PROTECT 不同的是,如果被引用的对象也引用了一个在同一操作中被删除的不同对象,但通过 CASCADE 关系,则允许删除被引用的对象。

  • SET_NULL
manufacturer = models.ForeignKey(Manufacturer, on_delete=models.SET_NULL,null=True)

设置 ForeignKey 为空;只有当 null 为 True 时,才有可能。

  • SET_DEFAULT
manufacturer = models.ForeignKey(Manufacturer, on_delete=models.SET_DEFAULT default=1)

将 ForeignKey 设置为默认值,必须为 ForeignKey 设置一个默认值。

  • SET()
#定义一个函数进行值得返回
def get_manufacturer()return 1manufacturer = models.ForeignKey(Manufacturer, on_delete=models.SET(get_manufacturer),)

将 ForeignKey 设置为传递给 SET() 的值,如果传递了一个可调用的值,则为调用它的结果。在大多数情况下,为了避免在导入 models.py 时执行查询,传递一个可调用对象是必要的

  • DO_NOTHING
manufacturer = models.ForeignKey(Manufacturer, on_delete=models.DO_NOTHING)

不采取任何行动。如果你的数据库后端强制执行引用完整性,这将导致一个 IntegrityError 除非你手动添加一个 SQL ON DELETE 约束条件到数据库字段。

on_delete 的可能值可以在 django.db.models 中找到。

地区的自关联实例

以下使用地区的自关联查询为实例


#模型创建  model.py
class District(models.Model):parent = models.ForeignKey("self",null=True,blank=True,on_delete=models.CASCADE,related_name="child", #verbose_name="父级地区",)name = models.CharField(max_length=128, help_text="地区名称", verbose_name="地区名称")level = models.IntegerField(default=0, help_text="地区级别", verbose_name="地区级别")full_name = models.CharField(max_length=256, help_text="地区全名", verbose_name="地区全名")def __str__(self):return self.full_nameclass Meta:managed=Trueverbose_name = "地区信息"verbose_name_plural = verbose_name
#视图调用模型以drf框架的视图的使用APIView主
class CityCountyView(APIView):"""父级下二级地区信息获取"""authentication_classes = [BasicAuthentication]permission_classes = (AllowAny,)@swagger_auto_schema(operation_description='父级下二级地区信息获取', responses={200: {}})def get(self, request, pk):# 判断有没有缓存,有缓存使用缓存,没有缓存去数据库查询存入缓存一天sub_data = cache.get('sub_data_%s' % pk)if not sub_data:try:# 获取到前端传过来的父级id  查询出父级对象parent_obj = District.objects.get(id=pk)# 获取对象的所有外键关联的子级sub_objs = parent_obj.child.all()subs = []# 组织数据for sub in sub_objs:subs.append({'id': sub.id, 'name': sub.name, })sub_data = {'id': pk, 'name': parent_obj.name, 'subs': subs}except Exception as e:print(e)return Response({'code': 400, 'errmsg': '查询失败'})cache_key_name = 'sub_data_%s' % pkcache.set(cache_key_name, sub_data, 3600 * 24) #return Response({'code': 0, 'errmsg': 'ok', 'sub_data': sub_data})

动态生成模型类


#使用函数+class来定义
def getTaskDetailModel(table_name):class MyCLass(models.Model):task = models.ForeignKey(Task, on_delete=models.CASCADE, related_name='details', verbose_name='任务')user_id = models.IntegerField(verbose_name='用户ID')created_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')is_complet = models.BooleanField(default=False, verbose_name='是否完成')class Meta:db_table = table_namereturn MyCLass#使用函数+type进行创建动态类
def create_task_detail_model(password_code):classname = f'TaskDetail_{password_code}'class Meta:db_table = classnamereturn type(classname, (models.Model,), {'task': models.ForeignKey(Task, on_delete=models.CASCADE, related_name='details', verbose_name='任务'),'user_id': models.IntegerField(verbose_name='用户ID'),'created_time': models.DateTimeField(auto_now_add=True, verbose_name='创建时间'),'is_complet': models.BooleanField(default=False, verbose_name='是否完成'),'__str__': lambda self: f"{self.task.password_code} - {self.user_id}",'Meta': Meta,'__module__': __name__,})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/623468.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(每日持续更新)jdk api之FileInputStream基础、应用、实战

博主18年的互联网软件开发经验,从一名程序员小白逐步成为了一名架构师,我想通过平台将经验分享给大家,因此博主每天会在各个大牛网站点赞量超高的博客等寻找该技术栈的资料结合自己的经验,晚上进行用心精简、整理、总结、定稿&…

将PDF发票转换为excel、xml结构化数据的完美解决方案

随着电子发票的普及,越来越多的企业和个人开始使用PDF格式的电子发票。然而,有时我们需要将电子发票转换为XML格式以便于处理和分析。本文将介绍如何将收到的PDF发票下载为excel、xml文件。首先,我们需要明确一点,PDF是一种基于图…

1. FPGA概述

文章目录 1. 什么是FPGA2. 学习FPGA有什么用3. 学习FPGA需要何种先决条件 1. 什么是FPGA 这个问题太low了,身处数字时代,从事电子信息行业,居然不知道FPGA?岂非笑谈? 介绍FPGA的资料太多了,还是从它的字面…

Could NOT find Threads (missing: Threads_FOUND)

具体错误 -- Performing Test CMAKE_HAVE_LIBC_PTHREAD -- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Failed -- Looking for pthread_create in pthreads -- Looking for pthread_create in pthreads - not found -- Looking for pthread_create in pthread -- Looking for…

C#编程-属性和反射

属性和反射 属性是将元数据信息和行为添加到应用程序代码中的简单技术。属性是允许您将声明信息添加到程序的元素。此声明信息在运行时用途广泛,可使用应用程序开发工具在设计时使用。 介绍属性 对象是由其属性值描述的。例如,汽车可以使用它的构造、型号或颜色来描述。类似…

ART-Adversarial Robustness Toolbox检测AI模型及对抗攻击的工具

一、工具简介 Adversarial Robustness Toolbox 是 IBM 研究团队开源的用于检测模型及对抗攻击的工具箱,为开发人员加强 AI模型被误导的防御性,让 AI 系统变得更加安全,ART支持所有流行的机器学习框架 (TensorFlow,Ker…

SpringMVC RESTful案例

文章目录 1、准备工作2、功能清单3、具体功能:访问首页a>配置view-controllerb>创建页面 4、具体功能:查询所有员工数据a>控制器方法b>创建employee_list.html 5、具体功能:删除a>创建处理delete请求方式的表单b>删除超链接…

Web3社交治理:用户参与决策的新模式

Web3时代的到来不仅仅带来了区块链技术的创新,还为社交治理带来了全新的模式。传统社交平台上的决策权通常集中在平台的运营方,而Web3社交治理的兴起意味着用户能够更直接地参与到社交平台的决策过程中。本文将深入探讨Web3社交治理的背景、工作原理以及…

帆软笔记-决策表报对象使用(两表格联动)

效果描述如下: 数据库中有个聚合商表,和一个储能表,储能属于聚合商,桩表中有个字段是所属聚合商。 要求帆软有2个表格,点击某个聚合商,展示指定的储能数据。 操作: 帆软选中表格单元&#xf…

C语言实现动态数组

1.mj版本的动态数组 #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #define DEFAULT_CAPACITY 10 #define ELEMENT_NOT_FOUND -1 // 定义全局变量 // 数组元素个数 int size 0; // 初始化动态数组 int* initArray(int capacity) {// 如果…

es5和es6的区别

ES5 和 ES6 的区别 ECMAScript5&#xff0c;即 ES5&#xff0c;是 ECMAScript 的第五次修订&#xff0c;于 2009 年完成标准化 ECMAScript6&#xff0c;即 ES6&#xff0c;是 ECMAScript 的第六次修订&#xff0c;于 2015 年完成&#xff0c;也称 ES2015 ES6 是继 ES5 之后的一…

SpringBoot 入门教程

1.复习SSM项目中&#xff0c;用spring&#xff0c;mybatis,springmvc这三个框架整合的项目。 SSM项目的所有类&#xff0c;这是用SSM整合一个搜索书籍种类和呈现的前端和后端的ssm的小项目。 2.springboot如何去开发这个页面&#xff1a; 新建springboot项目&#xff0c;勾选对…

<软考高项备考>《论文专题 - 68 质量管理(7) 》

7 管理关系论文解析 7.1 项目质量与进度、成本、范围之间的密切关系。&#xff08;2018年上&#xff09; 在项目管理三角形中&#xff0c;质量位于进度&#xff0c;成本&#xff0c;范围的中间的位置。 规划质量管理的输入中有需求文件&#xff0c;也就是说先有范围有需求的基…

MeshLab生成分形地形

文章目录 分型地形脊状多重分形其他地形 分型地形 分形地形是一种较为复杂的几何对象&#xff0c;MeshLab提供了下列五种地形生成算法&#xff0c;并且贴心地给出了每种算法相对较好的参数。 算法SeedOctaves缺项性分形增量偏移增益fBM(fractal Brownian Motion)11021.2--Sta…

【WPF.NET开发】WPF中的版式

本文内容 改进的文本质量和性能丰富的版式增强的国际文本支持增强的字体支持新的文本应用程序编程接口 (API) 本主题介绍 WPF 的主要版式功能。 这些功能包括改进的文本呈现质量和性能、OpenType 版式支持、增强的国际文本、增强的字体支持和新的文本应用程序编程接口 (API)。…

VUE好看的个人博客源码

文章目录 1.设计来源1.1 首页界面1.2 我的日记界面1.3 我的文章界面1.3.1 文章列表1.3.2 文章时间轴1.3.3 文章详细 1.4 我的相册界面1.5 我的源码界面1.6 认识我界面 2.效果和源码2.1 动态效果2.2 源码目录结构 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https:/…

从头安装与使用一个docker GPU环境

GPU版docker的安装与使用 欢迎使用GPU版docker安装使用说明使用官方教程安装docker新建一个GPU版docker环境调用docker环境执行本地python文件 欢迎使用GPU版docker安装使用说明 使用官方教程安装docker 导入源仓库的GPG key curl -fsSL https://download.docker.com/linux/…

【计算机组成原理】期末复习试卷

目录 第一套试卷 第一套答案 第二套试卷 第二套答案 第三套试卷 第四套试卷 剩余试卷下载 第一套试卷 一、选择题&#xff08;共20分&#xff0c;每题1分&#xff09; 1&#xff0e;冯诺伊曼机工作方式的基本特点是______。 A&#xff0e;多指令流单数据流&#xff1b; B&#…

C++八股2

虚拟内存 虚拟内存是计算机系统内存管理的一种技术&#xff0c;它为每个进程提供一个独立的、连续的地址空间&#xff0c;即使物理内存有限或不连续。在C编程中&#xff0c;操作系统通过页表将虚拟地址映射到物理内存地址上。当程序试图访问不在物理内存中的虚拟地址时&#xf…

03MARL-联合策略与期望回报

文章目录 前言一、MARL问题组成二、联合策略与期望回报1.History-based expected return2.Recursive expected return 前言 多智能体强化学习问题中的博弈论知识——联合策略与期望回报 一、MARL问题组成 二、联合策略与期望回报 定义一种普遍的期望回报&#xff0c;能够用于…