Django基础之ORM初识

server/2025/1/16 11:45:46/

一.前言

今天我们大致来了解一下django的orm,只是简单的了解,具体的会在下一期和大家来说,本质是关系对象映射,简单点来说就是翻译,利用类创建数据库

二.表结构

2.1 基础配置

首先在app中的models.py中按照规则编写类

编写类

python">from django.db import modelsclass UserInfo(models.Model):name = models.CharField(max_length=16)age = models.IntegerField()

注册app(这个前面都讲过了)

命令,django根据models中类生成一个 对数据库操作的配置文件 => migrations

python manage.py makemigrations 

 

命令,读取已经注册么给app中的migrations目录将配置文件 -> 转换成:生成表,修改表 SQL -> 连接数据库去运行。

python manage.py migrate 

  • 那个数据库?

  • 数据库账户和密码?

这节就不跟大家说如何去改配置了,通常我们都是配置mysql,这次我们就用他默认的

常见问题:请不要再手动去修改数据的表结构 + 时刻保证 ORM和数据表是对应。

2.2 常见字段和参数

字段

CharField //字符类型

SmallIntegerField //短整型
IntegerField //整形
BigIntegerField //长整型

DateField //日期
DateTimeField //日期和具体时间

BooleanField  -> 其实数据库不支持真假,根据SmallIntegerField创造出来出来。 0  1

DecimalField  -> 精确的小数

name=models.CharField(max_length=16,verbose_name='姓名')
age=models.IntegerField(verbose_name='年龄')

参数

通用参数

verbose_name="姓名" :用来知道这个字段的含义

default :默认值

null=True:通常和blank一起写,允许数据库值为空

blank=True:允许页面展示为空

db_index=True:建立索引

choices=(("sh", "上海"), ("bj", "北京")) :采用元组套着元组,表示值只能元组里面选,里面的元组前面是数据库存储,后面是页面的展示

unique=True :唯一值,不允许重复

字符类型

max_length 一定要加上,约束最大长度

code = models.CharField(verbose_name="姓名", max_length=16, choices=(("sh", "上海"), ("bj", "北京")),default="sh")

整数类型

无特殊参数

count = models.IntegerField(verbose_name="数量", default=1, null=True, blank=True, unique=True)

时间类型

auto_now=True :添加值的时候自动把当前时间添加进去,就可以不用手动传

register_date = models.DateField(verbose_name="注册时间", auto_now=True)

精准小数类型

max_digits=10  :最大长度是10

decimal_places=2  :小数点后面保留两位

示例: 

python">from django.db import modelsclass UserInfo(models.Model):name = models.CharField(verbose_name="姓名", max_length=16, db_index=True)age = models.PositiveIntegerField(verbose_name="年龄")email = models.CharField(verbose_name="邮箱", max_length=128, unique=True)amount = models.DecimalField(verbose_name="余额", max_digits=10, decimal_places=2, default=0)register_date = models.DateField(verbose_name="注册时间", auto_now=True)class Goods(models.Model):title = models.CharField(verbose_name="标题", max_length=32)# detail = models.CharField(verbose_name="详细信息", max_length=255)detail = models.TextField(verbose_name="详细信息")price = models.PositiveIntegerField(verbose_name="价格")count = models.PositiveBigIntegerField(verbose_name="库存", default=0)

2.3 表关系 

一对多关系:

 

有的时候我们会有一对多的关系,比如上图,一个部门会有多个用户,那此时此刻我们就要创建表关系了

python">from django.db import modelsclass Department(models.Model):'''部门表'''title=models.CharField(verbose_name='部门标题',max_length=16)class UserInfo(models.Model):'''用户表'''name=models.CharField(verbose_name='姓名',max_length=16)# to_fields如果不写就是默认关联id字段 models.CASCADE就是级联删除depart=models.ForeignKey(verbose_name='部门ID',to='Department',to_field='id',on_delete=models.CASCADE)# models.SET_NULL 删除就设置为空# depart=models.ForeignKey(verbose_name='部门ID',to='Department',to_field='id',on_delete=models.SET_NULL,null=True,blank=True)# models.SET_DEFAULT 删除就设置成默认值# depart=models.ForeignKey(verbose_name='部门ID',to='Department',to_field='id',on_delete=models.SET_DEFAULT,default=1)

多对多关系:

 

如图这个就是一个多对多关系,男生可以和任意的女生约会,女生也可以和任意的男生约会,但是如果我们在男女后面都加上一个约会的男女字段,那么就会出现大量的冗余,此时此刻我们就需要创建第三张表,表中对应上男女的字段, 专门存储男女的约会信息

python">from django.db import models
class Boy(models.Model):name=models.CharField(verbose_name='姓名',max_length=16)class Girl(models.Model):name=models.CharField(verbose_name='姓名',max_length=16)class B2G(models.Model):bid=models.ForeignKey(verbose_name='男生ID',to='Boy',to_field='id',on_delete=models.CASCADE)gid=models.ForeignKey(verbose_name='女生ID',to='Girl',to_field='id',on_delete=models.CASCADE)

或者使用ManytoManyField字段自动生成第三张表,但是这个表只能对应上两个字段的对应关系,无法再加上其他数据,例如约会地点啥啥啥的

python">from django.db import models
class Boy(models.Model):name=models.CharField(verbose_name='姓名',max_length=16)class Girl(models.Model):name=models.CharField(verbose_name='姓名',max_length=16)relation=models.ManyToManyField(verbose_name='男女关系',to='Boy')

三.总结 

今天主要还是简单知识点,做个了解就行了,下次会和大家具体讲orm,那个篇幅就很长了,本章相当于是药引,下一期才是猛药

四.补充 

下一期将和具体讲解一下orm,期待大家的点赞关注加收藏 

 


http://www.ppmy.cn/server/158813.html

相关文章

mac下使用arthas分析工具报错

mac下使用arthas分析工具 依赖初次运行报错运行前的准备/usr/libexec/java_home -V 返回结果解释:为什么有两个版本?如果使用的是不带参数的命令:设置 JAVA_HOME / 如何选择要使用的 JVM:遗留的问题 依赖 在 JDK8 中,…

vue组件(Ⅰ)

目录 引入 一、组件基础 1.组件组成结构在components文件当中新建文件MyApp.vue 2.组件引用结构-----在App.vue当中设置如下属性 二、组件的嵌套关系 1.Header.vue 2.Main.vue 3.Aside.vue 4.Article.vue 在Main.vue当中注册 5.Itme.vue 在Aside.vue当中注册 三、组…

Jenkins-简介/安装!

一. 关于持续集成: 持续集成(CI ) [ Continuous Integration ],通俗来讲,就是一个能监控版本控制系统变化的工具,可以自动编译和测试集成的应用程序。出现问题,能够及时的通知相应人员。持续集成是一种思维工具集&…

TypeScript 爬虫项目实战:抓取豆瓣电影 Top 250(TypeScript简单应用)

项目介绍 通过 TypeScript 实现一个简单的爬虫程序,从豆瓣电影 Top 250 页面抓取电影的标题和评论信息,并将数据存储到本地 JSON 文件中。该项目使用了 superagent 和 cheerio 两个核心工具: superagent:一个轻量的 HTTP 请求库…

想法分享,利用html通过求输入框中用户输入数组的最大值

我有一个非常有趣的想法 做一个网页求用户输入的数组的最大值 1.直接让用户输入进一个类似数组的容器,输入几个数字之后,点击按钮 2.这个方法不行,因为form表单没有直接类似数组的容器,所以用input输入框代替 3.Input直接输入的是…

Unity3D实现加载.abc动画模型

系列文章目录 unity工具 文章目录 系列文章目录unity工具👉前言👉一、效果展示👉二、使用步骤👉2-1、导入插件👉2-1、导入模型👉三、实现代码控制动画👉四、加载解析👉4-1、数据读取与解析👉4-2、动画播放机制👉4-3、材质👉壁纸分享👉总结👉前言 .…

《C++11》并发库:简介与应用

在C11之前,C并没有提供原生的并发支持。开发者通常需要依赖于操作系统的API(如Windows的CreateThread或POSIX的pthread_create)或者第三方库(如Boost.Thread)来创建和管理线程。这些方式存在以下几个问题: …

关于反向传播算法个人的一些思考

关于反向传播算法个人的一些思考 非常简单的一个例子让情况变得复杂一些未完待续 本文为笔者个人对反向传播算法的一个理解,由于笔者也是刚刚踏上深度学习之路,所以很多地方可能理解的不到位,欢迎各位在评论处指出。 本文适合已经了解过反向传…