数据模型(models)

news2024/11/15 6:12:17

自学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即可。

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

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

相关文章

打造智能家居:用ESP32轻松实现无线控制与环境监测

ESP32是一款集成了Wi-Fi和蓝牙功能的微控制器,广泛应用于物联网项目。它由Espressif Systems公司开发,具有强大的处理能力和丰富的外设接口。下面我们将详细介绍ESP32的基础功能和引脚功能,并通过具体的实例项目展示其应用。 主要功能 双核处…

YOLOv10(6):YOLOv10基于TensorRT的部署(基于INetworkDefinition)

1. 写在前面 我们在前面已经讲过很多关于YOLOv10的一些知识点,也简单理了一下如何训练自己的数据。 现在本篇文章主要是讲解一下如何在TensorRT中部署YOLOv10,相信经过这一步,各位小伙伴已经能够无限的接近于将YOLOv10产品化了。 另一个需要说…

qt creator在windows上配置调试器

从微软下载winsdk:https://developer.microsoft.com/zh-cn/windows/downloads/sdk-archive/ 运行winsdksetup.exe 选择下载 选择debugging tools for windows 选择安装x64版本debug工具 重新打开qt,自动选择安装的编译器

[汇总] Docker容器详解 Macvlan 创建不同容器独立跑仿真(持续更新中)

一、概念介绍 1.1 什么是macvlan macvlan是一种网卡虚拟化技术,能够将一张网卡(Network Interface Card, NIC)虚拟出多张网卡,这意味着每个虚拟网卡都能拥有独立的MAC地址和IP地址,从而在系统层面表现为完全独立的网络…

下一代广域网技术-Segment Routing(SR)

1.SR MPLS 1.1.广域网VPN技术的演进 特殊的EVPN:从L2VPN发展的EVPN 以VPLS为例的L2VPN存在多种问题,例如业务部署复杂、网络规模受限、不支持双归等,IETF提出EVPN来解决这些问题EVPN最初被设计为一个基于BGP扩展的L2VPN技术,但…

DataWhale - 吃瓜教程学习笔记(三)

学习视频:第3章-对数几率回归_哔哩哔哩_bilibili 西瓜书对应章节: 3.3 对数几率回归 sigmoid函数 极大似然估计建模 信息论 以概率论、随机过程为基本研究工具,研究广义通信系统的整个过程 - 信息熵 (信息期望) 度…

上海亚商投顾:三大指数均跌超1% 全市场下跌个股近5000只

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 三大指数昨日震荡调整,尾盘集体跌超1%,微盘股指数跌逾4%,黄白二线分化明显…

【Hadoop集群搭建】实验3:JDK安装及配置、Hadoop本地模式部署及测试

1. 安装 SSH 工具 SSH Secure Shell Client 传输软件 FinalShell(推荐使用) 1.1使用SSH工具将JDK安装包上传至虚拟主机hadoop01, hadoop02, hadoop03,sogou500w 数据上传至 hadoop01。 a. 在虚拟主机/usr 目录下创建文件夹 java,JDK 上传至此目录&…

昇思25天学习打卡营第1天|初学教程

文章目录 背景创建环境熟悉环境打卡记录学习总结展望未来 背景 参加了昇思的25天学习记录,这里给自己记录一下所学内容笔记。 创建环境 首先在平台注册账号,然后登录,按下图操作,创建环境即可 创建好环境后进入即可&#xff0…

死锁的条件、预防、避免、检测

死锁的条件、预防、避免、检测 死锁的必要条件 互斥条件:一个资源一次只能给一个进程使用,非共享请求与保持条件:保持自己资源的同时请求其他资源,该资源可能被占有非剥夺条件:不能强行夺走资源,只能等别的…

【10】交易-交易的结构

1. 交易的结构 1.1 引言 需要说明的是,在我们之前的例子中,区块中的交易(data)是用字符串数据来表示的,但在真正的比特币网络中,交易是一个复杂的数据结构,记录了不同地址之间的价值转移信息。在比特币系统中没有账号或身份信息的概念的,也不会记录地址和身份之间的关…

iOS之如何创建.a静态库

番外:想要查看如何创建.framework静态库可前往看我​​​​​​​iOS之如何创建.framework静态库-CSDN博客这篇文章。 一、创建静态库项目 ①、打开 Xcode 并创建一个新的 Xcode 项目。 ②、选择 "macOS" -> "Framework & Library" -&…

“拿来主义”学习元素裁剪(附源码)

“拿来主义”学习元素裁剪 欢迎关注: 小拾岁月,获取源码。 参考链接:https://mp.weixin.qq.com/s/TsOOhUAff6OeqPW7A9JuaQ 预期效果图 需求分析 首先从需求上来看,需要一个主元素用于展示用户头像。例外,在页面无操…

[保姆级教程]uniapp设置字体引入字体格式

文章目录 在 UniApp 中设置和引入自定义字体(如 .ttf、.woff、.woff2 等格式)通常涉及几个步骤。 准备字体文件: 首先,你需要有字体文件。这些文件通常以 .ttf、.woff 或 .woff2 格式提供。确保有权使用这些字体,并遵守…

Docker配置国内镜像加速-2

Docker 官方镜像仓库(如 Docker Hub)可能由于网络原因,在某些地区或网络环境下下载速度较慢。使用镜像加速可以从距离用户更近、网络条件更好的镜像服务器获取镜像,从而显著提高下载速度,节省时间。 1.测试是否安装 d…

基于Java少儿编程管理系统设计和实现(源码+LW+调试文档+讲解等)

💗博主介绍:✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者,博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 🌟文末获取源码数据库🌟 感兴趣的可以先收藏起来,…

PyTorch实战:借助torchviz可视化计算图与梯度传递

文章目录 Tensor计算的可视化(线性回归为例) 如何使用可视化库torchviz 安装graphviz软件 安装torchviz库使用 torchviz.make_dot() 在学习Tensor时,将张量y用张量x表示,它们背后会有一个函数表达关系,y的 grad_f…

2024 年首份软件漏洞报告

Action1 Corporation 发布了其首份 2024 年软件漏洞评级报告。 该报告旨在为首席信息安全官 (CISO) 和首席信息官 (CIO) 提供有关其软件生态系统的战略见解。 它根据软件供应商的安全记录对其进行评估,以便做出更明智的采购决策。 此次发布是在国家漏洞数据库 (N…

让在制品管理更有效

徐总的工厂生产线非常繁忙,每天都在不停地运转。但在制品的流转和存储也非常混乱,导致了很多问题的出现。 一方面,由于缺乏有效的管理,在制品的库存不断增加,占用了大量的资金和空间资源。这些库存不仅增加了库存成本&…

从50分到90分,网站性能优化实践

难以置信: 我可是用尊贵的Vue3Ts开发的呢 (手动狗头). 十分抗拒: 迫于yin威,我给网站做了体检和手术. 体检 – 市面上的体检套餐有很多种,但其实都是换汤不换药.那药(标准)是什么呢?我们会在下面说明.这里我选择了谷歌亲儿子"灯塔"(LightHouse)进行性能体检. 体检…