当前位置: 首页 > news >正文

数据模型(models)

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm=1001.2014.3001.5501

(1)在App中添加数据模型

在app1的models.py中添加如下代码:

from django.db import models      # 引入django.db.models模块

class Person(models.Model):

    """

    编写Person模型类,数据模型应该继承于models.Model或其子类

    """

    # 第一个字段使用models.CharField类型

    first_name = models.CharField(max_length=30)

    # 第二个字段使用models.CharField类型

    last_name = models.CharField(max_length=30)

Person模型中的每一个属性都指明了models下面的一个数据类型,代表了数据库中的一个字段。上面的类在数据库中会创建如下的表:

CREATE TABLE myapp_person (

    "id" serial NOT NULL PRIMARY KEY,

    "first_name" varchar(30) NOT NULL,

    "last_name" varchar(30) NOT NULL

);

对于一些公有的字段,为了简化代码,可以使用如下的实现方式:

from django.db import models      # 引入django.db.models模块

class CreateUpdate(models.Model):      # 创建抽象数据模型,同样要继承于models.Model

    # 创建时间,使用models.DateTimeField

    created_at = models.DateTimeField(auto_now_add=True)

    # 修改时间,使用models.DateTimeField

    updated_at = models.DateTimeField(auto_now=True) 

    class Meta:              # 元数据,除了字段以外的所有属性

        # 设置model为抽象类。指定该表不应该在数据库中创建

        abstract = True 

class Person(CreateUpdate):          # 继承CreateUpdate基类

    first_name = models.CharField(max_length=30)

    last_name = models.CharField(max_length=30)

class Order(CreateUpdate):          # 继承CreateUpdate基类

    order_id = models.CharField(max_length=30, db_index=True)

    order_desc = models.CharField(max_length=120)

这时,我们用于创建日期和修改日期的数据模型就可以继承于CreateUpdate类了。

上面讲解了数据模型的创建方式,下面介绍django.db.models提供的常见的字段类型,如表5所示。

表5   Django数据模型中常见字段类型及说明

字 段 类 型

说    明

AutoField

一个id自增的字段,但创建表过程Django会自动添加一个自增的主键字段

BinaryField

一个保存二进制源数据的字段

BooleanField

一个布尔值的字段,应该指明默认值,管理后台中默认呈现为CheckBox形式

NullBooleanField

可以为None值的布尔值字段

CharField

字符串值字段,必须指明参数max_length值,管理后台中默认呈现为TextInput形式

TextField

文本域字段,对于大量文本应该使用TextField。管理后台中默认呈现为Textarea形式

DateField

日期字段,代表Python中datetime.date的实例。管理后台默认呈现TextInput形式

DateTimeField 

时间字段,代表Python中datetime.datetime实例。管理后台默认呈现TextInput

EmailField

邮件字段,是CharField的实现,用于检查该字段值是否符合邮件地址格式

FileField

上传文件字段,管理后台默认呈现ClearableFileInput形式

ImageField

图片上传字段,是FileField的实现。管理后台默认呈现ClearableFileInput形式

IntegerField 

整数值字段,在管理后台默认呈现NumberInput或者TextInput形式

FloatField

浮点数值字段,在管理后台默认呈现NumberInput或者TextInput形式

SlugField

只保存字母数字和下划线和连接符,用于生成url的短标签

UUIDField

保存一般统一标识符的字段,代表Python中UUID的实例,建议提供默认值default

ForeignKey

外键关系字段,需提供外检的模型参数,和on_delete参数(指定当该模型实例删除的时候,是否删除关联模型),如果要外键的模型出现在当前模型的后面,需要在第一个参数中使用单引号

ManyToManyField

多对多关系字段,与ForeignKey类似

OneToOneField

一对一关系字段,常用于扩展其他模型

(2)执行数据库迁移

1)创建完数据模型后,开始做数据库迁移,首先我们不希望用Django默认自带的SQLite数据库,我们想使用MySQL数据库,在项目的settings.py配置文件中找到如下的配置:

DATABASES = {

    'default': {

        'ENGINE': 'django.db.backends.sqlite3',

        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),

    }

}

替换为:

DATABASES = {

    'default': {

        'ENGINE': 'django.db.backends.mysql',

        'NAME': 'demo',

        'USER': 'root',

        'PASSWORD': '您的数据库密码'

    }

}

2)创建数据库,在终端连接数据库,执行以下命令:

mysql -u root -p

3)按照提示输入您的数据库密码,连接成功后执行如下语句创建数据库。

create database demo default character set utf8;

创建成功后,即可在Django中使用数据库迁移,并在MySQL中创建数据表了。创建数据库命令执行效果如图21所示。

图21   创建数据库命令执行效果

4)安装数据库的驱动,Python 3.x使用pymysql作为MySQL的驱动,命令如下:

pip install pymysql

5)然后找到“D:\Webprojcets\demo\demo\__init__.py”文件,在行首添加如下代码:

import pymysql

pymysql.install_as_MySQLdb()          # 为了使pymysql发挥最大数据库操作性能

6)执行以下命令,用来创建数据表。

python manage.py makemigrations           # 生成迁移文件

python manage.py migrate              # 迁移数据库,创建新表

7)创建数据表的效果如图22所示。

图22   创建数据表效果图

创建完成后,即可在数据库中查看这两张数据表了,Django会默认按照“app名称+下划线+模型类名称”的形式创建数据表,对于上面这两个模型,Django创建了如下表:

l  Person类对应app1_person表

l  Order类对应app1_order表

CreateUpdate是个抽象类,不会创建表结构,在数据库管理软件中查看创建的数据表,效果如图23所示。

图23   在数据库管理软件中查看创建的数据表

(3)了解Django数据API

这里所有的命令将在Django的交互命令行中执行,在项目根目录下启用交互命令行,执行以下命令:

python manage.py shell              # 启用交互命令行

导入数据模型命令:

from app1.models import Person, Order      # 导入Person和Order两个类

1)创建数据有如下两种方法:

l  方法1

p = Person.objects.create(first_name="hugo", last_name="zhang")

l  方法2

p=Person(first_name="hugo", last_name="张")

p.save()                            # 必须调用save()才能写入数据库

2)查询数据

l  查询所有数据

Person.objects.all()

l  查询单个数据

Person.objects.get(first_name="hugo")  # 括号内需要加入确定的条件,因为get方法只返回一个确定值

l  查询指定条件的数据

Person.objects.filter(first_name__exact="hugo")   # 指定first_name字段值必须为hugo

Person.objects.filter(last_name__iexact="zhang")  # 指定last_name字段值必须为zhang,且忽略大小写

Person.objects.filter(id__gt=1)                # 查找所有id值大于1的

Person.objects.filter(id__lt=100)                # 查找所有id值小于100的

# 排除所有创建时间大于现在时间的,exclude的用法是排除,和filter正好相反

Person.objects.exclude(created_at__gt=datetime.datetime.now(tz=datetime.timezone.utc)) 

# 过滤出所有first_name字段值包含h的然后将之前的查询结果按照id进行排序

Person.objects.filter(first_name__contains="h").order_by('id')

Person.objects.filter(first_name__icontains="h")  # 查询所有first_name值不包含h的

3)修改查询到的数据

修改之前需要查询到对应的数据或者数据集,代码如下:

p = Person.objects.get(first_name="hugo")

然后按照需求进行修改,例如:

p.first_name = "john"

p.last_name = "wang"

p.save()

注意:必须调用save()方法才能保存到数据库。

当然也可以使用get_or_create,如果数据存在就修改,不存在就创建,代码如下:

p, is_created = Person.objects.get_or_create(

    first_name="hugo",

    defaults={"last_name": "wang"}

)

get_or_create返回一个元组,一个数据对象和一个布尔值,defaults参数是一个字典。当获取数据的时候defaults参数里面的值不会被传入,也就是获取的对象只存在defaults之外的关键字参数的值。

4)删除数据

删除数据同样需要你先查找到对应的数据,然后进行删除,代码如下:

Person.objects.get(id=1).delete()

(1,({'app1.Person':1}))

技巧:大多数情况下我们不会直接删除数据库中的数据,我们希望在数据模型定义的时候,添加一个status字段,值为True和False,用来标记该数据是否是可用状态。在想要删除该数据的时候,将其值置为False即可。

相关文章:

数据模型(models)

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 (1)在App中添加数据模型 在app1的models.py中添加如下代码: from django.db import models # 引入django.…...

【CS.AL】算法核心之贪心算法 —— 力扣(LeetCode)743. 网络延迟时间 - Dijkstra算法题解

文章目录 题目描述References 题目描述 743. 网络延迟时间 - 力扣(LeetCode) 有 N 个网络节点,标记为 1 到 N。 给定一个列表 times,其中 times[i] (u, v, w) 表示有一条从节点 u 到节点 v 的时延为 w 的有向边。 现在&#xf…...

25、架构-微服务的驱动力

微服务架构的驱动力可以从多方面探讨,包括灵活性、独立部署、技术异构性、团队效率和系统弹性等。 灵活性和可维护性 灵活性是微服务架构的一个主要优势。通过将单体应用拆分成多个独立的微服务,开发团队可以更容易地管理、维护和更新各个服务。每个微…...

JeecgFlow事件网关概念及案例

事件网关 通常网关基于连线条件决定后续路径,但事件网关有所不同,其基于事件决定后续路径。事件网关的每条外出顺序流都需要连接一个捕获中间事件。 事件网关只有分支行为,流程的走向完全由中间事件决定。可以从多条候选分支中选择事件最先达…...

使用鸿蒙HarmonyOs NEXT 开发 快速开发 简单的购物车页面

目录 资源准备:需要准备三张照片:商品图、向下图标、金钱图标 1.显示效果: 2.源码: 资源准备:需要准备三张照片:商品图、向下图标、金钱图标 1.显示效果: 定义了一个购物车页面的布局&#x…...

iOS 中 attribute((constructor)) 修饰的函数

开发环境声明:此文描述的 attribute((constructor)) 特指使用 Objective-C 开发 iOS、MacOS,Swift 语言不支持这种属性修饰符。 初识 attribute((constructor)) 在 Objective-C 开发中,attribute((constructor)) 是一个 GCC 和 Clang 编译器…...

原生js实现图片预览控件,支持丝滑拖拽,滚轮放缩,放缩聚焦

手撸源代码如下&#xff1a;注释应该很详细了&#xff0c;拿去直用 可以放到在线编辑器测试&#xff0c;记得修改图片路径 菜鸟教程在线编辑器 <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" conten…...

C语言入门课程学习笔记9:指针

C语言入门课程学习笔记9 第41课 - 指针&#xff1a;一种特殊的变量实验-指针的使用小结 第42课 - 深入理解指针与地址实验-指针的类型实验实验小结 第43课 - 指针与数组&#xff08;上&#xff09;实验小结 第44课 - 指针与数组&#xff08;下&#xff09;实验实验小结 第45课 …...

借助 Cloudflare D1 和 Drizzle 在 Astro 上实现全栈

使用 Cloudflare D1 和 Drizzle ORM 将后端添加到 Astro 项目的分步指南 文章目录 安装 Astro添加 Cloudflare 适配器部署到 Pages安装 wrangler 并登录创建 D1 数据库创建 wrangler.toml 文件将 .wrangler 添加到 .gitignore更新 astro.config.ts安装 Drizzle 依赖项创建 driz…...

SUSE linux 15的网络管理

1 手工配置网络 wicked提供了一种新的网络配置框架。自SUSE 12起&#xff0c;SUSE使用了新的网络管理工具wicked&#xff0c;这个是区别与其他常见发行版的。常见的发行版目前大多使用的是NetworkManager服务进行网络管理。 1.1 wicked网络配置 传统网络接口管理面临的挑战之…...

海康威视-下载的录像视频浏览器播放问题

目录 1、播放异常比对 2、视频编码检查 2.1、正常视频解析 2.2、海康视频解析 2.3、比对工具 3、转码 3.1、maven依赖 3.2、实现代码 4、验证 在前面的文章&#xff08;海康威视-按时间下载录像文件_海康威视 sdk 下载录像 大小0-CSDN博客&#xff09;中&#xff0c;通…...

养殖自动化管理系统:开启智慧养殖新篇章

在现代农业的快速演进中&#xff0c;养殖业正经历一场前所未有的技术革命。养殖自动化管理系统&#xff0c;作为这场变革的前沿科技&#xff0c;正逐步成为推动行业高效、环保、可持续发展的关键力量。本文将深入探讨自动化养殖系统如何通过精准管理、智能监控、数据驱动决策&a…...

SmartEDA革新来袭:融合Multisim与Proteus精髓,引领电子设计新纪元!

在电子设计领域&#xff0c;每一次技术的革新都如同春风化雨&#xff0c;滋润着设计师们的心田。今天&#xff0c;我们迎来了一个划时代的电子设计自动化&#xff08;EDA&#xff09;工具——SmartEDA&#xff0c;它不仅融合了业界知名的Multisim和Proteus的精华&#xff0c;更…...

【FFmpeg】AVFormatContext结构体

【FFmpeg】AVFormatContext结构体 1.AVFormatContext结构体1.2 const struct AVInputFormat *iformat1.3 const struct AVOutputFormat *oformat 参考&#xff1a; FFMPEG结构体分析&#xff1a;AVFormatContext 示例工程&#xff1a; 【FFmpeg】调用ffmpeg库实现264软编 【FF…...

【SpringSecurity】认证与鉴权框架SpringSecurity——授权

目录 权限系统的必要性常见的权限管理框架SpringSecurity授权基本流程准备脚本限制访问资源所需权限菜单实体类和Mapper封装权限信息封装认证/鉴权失败处理认证失败封装鉴权失败封装配置SpringSecurity 过滤器跨域处理接口添加鉴权hasAuthority/hasAnyAuthorityhasRole/​ hasA…...

深入解析FTP:原理、架构与搭建方式

在当今互联网世界中&#xff0c;文件传输是日常工作和生活中不可或缺的一部分。FTP&#xff08;File Transfer Protocol&#xff0c;文件传输协议&#xff09;作为一种老而弥坚的协议&#xff0c;一直在文件传输领域发挥着重要作用。本文将从技术人的角度&#xff0c;详细分析F…...

Springboot与RestTemplate

RestTemplate是Spring提供的用于访问Rest服务的客户端&#xff0c;RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。 一、使用Get进行访问 1、获取json格式 使用 getForEntity() API 发起 GET 请求&#xff1a; RestTemplate restTemplate…...

端口发布与暴露

端口发布与暴露 目录 发布端口发布到临时端口发布所有端口试一试 使用 Docker CLI使用 Docker Compose 如果你一直在跟随本指南&#xff0c;你应该理解容器为应用程序的每个组件提供了隔离的进程。每个组件 - 如 React 前端、Python API 和 Postgres 数据库 - 都运行在自己的…...

Unity:使用Texture2D动态创建的图像无法正常显示 / 修改图像后未生效

开发中遇到需要动态绘制图像的需求&#xff0c;前后文代码如下所示&#xff1a; Texture2D newImageTexture new Texture2D(width, height); Color32[] newImagePixels new Color32[height * width];for (int y 0; y < height ; y) {for (int x 0; x < width; x){if…...

【LinuxC语言】详解TCP/IP

文章目录 前言TCP与UDP协议的介绍TCP协议流式传输TCP的三次握手连接TCP的四次挥手连接断开总结前言 在我们的日常生活中,无论是浏览网页,还是发送电子邮件,甚至是在线视频聊天,都离不开网络通信。而在网络通信中,TCP和UDP协议起着至关重要的作用。本文将以通俗易懂的语言…...

数字化转型下的企业人力资源信息系统研究

随着数字化转型的加速&#xff0c;企业人力资源管理面临着全新的挑战和机遇。传统的人力资源信息系统&#xff08;HRIS&#xff09;在新时代的要求下必须进行深刻的革新和升级&#xff0c;以更好地支持企业的发展战略和员工的需求。 数据驱动的决策支持 在当今这个信息化迅猛发…...

docker camunda 8.5 部署步骤

Camunda Platform 8 环境准备 Docker 版本要求 Docker 20.10.16 is required; docker compose version 1.27.0.;github 开源地址:https://github.com/camunda/camunda-platformcamunda7 文档地址:https://docs.camunda.org/manual/7.21/user-guide/process-engine/社区地址: …...

学懂C#编程:常用高级技术——委托(Delegate)应用场景——委托与Lambda表达式的结合使用详解

在C#中&#xff0c;委托与Lambda表达式的结合使用是现代编程实践中的一个重要且强大的特性&#xff0c;它极大地提高了代码的简洁性和可读性。下面将详细讲解这两个概念如何协同工作&#xff0c;以及如何在实际编程中有效利用它们。 委托基础 委托是C#中的一种引用类型&#x…...

05-java基础——循环习题

循环的选择&#xff1a;知道循环的次数或者知道循环的范围就使用for循环&#xff0c;其次再使用while循环 猜数字 程序自动生成一个1-100之间的随机数&#xff0c;在代码中使用键盘录入去猜出这个数字是多少&#xff1f; 要求&#xff1a;使用循环猜&#xff0c;一直猜中为止…...

网络安全等级保护测评

网络安全等级保护 《GB17859 计算机信息系统安全保护等级划分准则》 规定计算机信息系统安全保护等级共分五级 《中华人民共和国网络安全法》 “国家实行网络安全等级保护制度。 等级测评 测评机构依据国家网络安全等级保护制度规定&#xff0c;按照有关 管理规范和…...

真有被这套零售数据分析方案惊艳到

在数字化时代&#xff0c;零售行业的竞争愈发激烈&#xff0c;如何精准把握市场动态、优化业务流程、提升市场竞争力成为了每一家零售企业都面临的挑战。奥威BI零售数据分析方案&#xff0c;一款具备全面、高效、智能的数据分析能力的BI方案出现地恰到好处。 奥威BI零售数据分…...

亚马逊卖家为何需要自养账号?揭秘背后的原因

亚马逊是一家极为重视用户体验的国际电商平台&#xff0c;因此用户的评论和星级评价对店铺排名影响深远。平台审核评论非常严格&#xff0c;这些评价直接影响商品在平台上的生存和发展。 在亚马逊上&#xff0c;用户的评分和评论对商品的成功至关重要。好评多的商品通常被认为优…...

牛了,LSTM+Transformer王炸结合创新,荣登Nature,精度高达95.65%

【LSTM结合Transformer】的研究方向探索了如何利用Transformer模型处理序列数据的能力以及LSTM在捕捉时间序列依赖性方面的优势。这一方向的意义在于通过融合两种模型的特点&#xff0c;提高了对复杂时空数据的预测准确性&#xff0c;尤其是在智能电网攻击检测、多变量时间序列…...

Java面试题:通过实例说明工厂模式和抽象工厂模式的用法,以及它们在解耦中的作用

工厂模式和抽象工厂模式是创建型设计模式中的两种&#xff0c;主要用于对象的创建&#xff0c;并且通过将对象的创建过程封装起来&#xff0c;来实现代码的解耦和灵活性。下面通过具体实例来说明这两种模式的用法及其在解耦中的作用。 工厂模式&#xff08;Factory Method Pat…...

成都欣丰洪泰文化传媒有限公司电商服务的创新者

在数字化浪潮席卷全球的今天&#xff0c;电商行业正以前所未有的速度蓬勃发展。作为这一领域的佼佼者&#xff0c;成都欣丰洪泰文化传媒有限公司凭借其对电商服务的深度理解和精准把握&#xff0c;成功在竞争激烈的市场中脱颖而出&#xff0c;成为行业内的佼佼者。 一、公司简…...