Django实践-03模型-01表生成模型

news2024/12/23 7:10:42

文章目录

  • Django实践-03模型
    • Django MTV之模型
    • 投票案例
      • 1.创建应用
        • 1.创建应用
        • 2.配置模板文件
      • 2.配置关系型数据库MySQL
        • 1.创建数据库
        • 2.创建表
        • 3.按照MySQL依赖
        • 4.修改settings.py文件 添加应用 配置数据库
        • 5. 基于数据库生成实体类
        • 3.使用ORM完成模型的CRUD操作
          • 1.新增
          • 2.删除
          • 3.更新
          • 4.查询
    • 总结

在这里插入图片描述

Django实践-03模型

官网:https://www.djangoproject.com/
博客:https://www.liujiangblog.com/
git:https://gitcode.net/mirrors/jackfrued/Python-100-Days

Django静态文件问题备注:
参考:
Django测试开发-20-settings.py中templates配置,使得APP下的模板以及根目录下的模板均可生效
解决django 多个APP时 static文件的问题

Django MTV之模型

MVC架构中的“模型”和“视图”的解耦合。所谓“模型”就是数据(的表示),数据模型通常通过数据库实现持久化操作,而关系型数据库在过去和当下都是持久化的首选方案。

投票案例

下面我们通过完成一个投票项目来讲解和模型相关的知识点。

投票项目的首页会展示某在线教育平台所有的学科;
点击学科可以查看到该学科的老师及其信息;
用户登录后在查看老师的页面为老师投票,可以投赞成票和反对票;
未登录的用户可以通过登录页进行登录;
尚未注册的用户可以通过注册页输入个人信息进行注册。

在这个项目中,我们使用MySQL数据库来实现数据持久化操作。

1.创建应用

1.创建应用

注意执行的位置,要在djangoproject的目录下执行

django-admin startapp polls

2.配置模板文件

在templates目录下创建polls目录。在polls目录下创建

展示学科的页面subjects.html
显示学科老师的页面teachers.html
登录页面login.html
注册页面register.html,

具体内容下文进行描述。

2.配置关系型数据库MySQL

1.创建数据库

  1. 在MySQL中创建数据库,创建用户,授权用户访问该数据库。
create database vote default charset utf8;
create user 'django'@'%' identified by 'django123';
grant all privileges on vote.* to 'django'@'%';
flush privileges;

2.创建表

  1. 在MySQL中创建保存学科和老师信息的二维表(保存用户信息的表稍后处理)。
use vote;

-- 创建学科表
create table `tb_subject`
(
	`no` integer auto_increment comment '学科编号',
    `name` varchar(50) not null comment '学科名称',
    `intro` varchar(1000) not null default '' comment '学科介绍',
    `is_hot` boolean not null default 0 comment '是不是热门学科',
    primary key (`no`)
);
-- 创建老师表
create table `tb_teacher`
(
    `no` integer auto_increment comment '老师编号',
    `name` varchar(20) not null comment '老师姓名',
    `sex` boolean not null default 1 comment '老师性别',
    `birth` date not null comment '出生日期',
    `intro` varchar(1000) not null default '' comment '老师介绍',
    `photo` varchar(255) not null default '' comment '老师照片',
    `gcount` integer not null default 0 comment '好评数',
    `bcount` integer not null default 0 comment '差评数',
    `sno` integer not null comment '所属学科',
    primary key (`no`),
    foreign key (`sno`) references `tb_subject` (`no`)
);

3.按照MySQL依赖

在虚拟环境中安装连接MySQL数据库所需的依赖项。

pip install mysqlclient -i https://pypi.tuna.tsinghua.edu.cn/simple

4.修改settings.py文件 添加应用 配置数据库

修改项目的settings.py文件,首先将我们创建的应用polls添加已安装的项目(INSTALLED_APPS)中,然后配置MySQL作为持久化方案。

INSTALLED_APPS = [
    # 新增polls
    'polls',
]

DATABASES = {
    'default': {
        # 数据库引擎配置
        'ENGINE': 'django.db.backends.mysql',
        # 数据库的名字
        'NAME': 'vote',
        # 数据库服务器的IP地址(本机可以写localhost或127.0.0.1)
        'HOST': 'localhost',
        # 启动MySQL服务的端口号
        'PORT': 3306,
        # 数据库用户名和口令
        'USER': 'django',
        'PASSWORD': 'django123',
        # 数据库使用的字符集
        'CHARSET': 'utf8',
        # 数据库时间日期的时区设定
        'TIME_ZONE': 'Asia/Shanghai',
    }
}

在配置ENGINE属性时,常用的可选值包括:sqlite3,postgresql,oracle,mysql

5. 基于数据库生成实体类

Django框架提供了ORM来解决数据持久化问题,ORM翻译成中文叫“对象关系映射”。利用Django的ORM,我们可以直接将刚才创建的学科表和老师表变成Django中的模型类。

python manage.py inspectdb > polls/models.py

在polls/models.py中生成如下代码,我们可以修改实体类,

# This is an auto-generated Django model module.
# You'll have to do the following manually to clean this up:
#   * Rearrange models' order
#   * Make sure each model has one field with primary_key=True
#   * Make sure each ForeignKey and OneToOneField has `on_delete` set to the desired behavior
#   * Remove `managed = False` lines if you wish to allow Django to create, modify, and delete the table
# Feel free to rename the models, but don't rename db_table values or field names.
from django.db import models


# 添加了注释部分verbose_name="名称"
class Subject(models.Model): # TbSubject 修改为 Subject
    no = models.AutoField(primary_key=True,verbose_name="编号")
    name = models.CharField(max_length=50,verbose_name="名称")
    intro = models.CharField(max_length=1000,verbose_name="介绍")
    is_hot = models.IntegerField(verbose_name="是否热门")

    class Meta:
        managed = False 
        db_table = 'tb_subject'


class Teacher(models.Model): # TbTeacher修改为Teacher
    no = models.AutoField(primary_key=True,verbose_name="编号")
    name = models.CharField(max_length=20,verbose_name="教师姓名")
    sex = models.IntegerField(verbose_name="性别")
    birth = models.DateField(verbose_name="出生年月")
    intro = models.CharField(max_length=1000,verbose_name="个人介绍")
    photo = models.CharField(max_length=255,verbose_name="照片")
    good_count = models.IntegerField(verbose_name="好评数") # gcount 修改为good_count
    bad_count= models.IntegerField(verbose_name="差评数") # bcount 修改为bad_count
    subject = models.ForeignKey(Subject, models.DO_NOTHING, db_column='sno') # sno 修改为 subject, TbSubject修改为Subject

    class Meta:
        managed = False
        db_table = 'tb_teacher'

3.使用ORM完成模型的CRUD操作

在终端中输入下面的命令进入到Django项目的交互式环境,然后尝试对模型的操作。

python manage.py shell
1.新增
from polls.models import Subject,Teacher

subject1 = Subject(name='Python全栈开发', intro='当下最热门的学科', is_hot=True)
subject1.save()
subject2 = Subject(name='全栈软件测试', intro='学习自动化测试的学科', is_hot=False)
subject2.save()
subject3 = Subject(name='JavaEE分布式开发', intro='基于Java语言的服务器应用开发', is_hot=True)
subject3.save()

在这里插入图片描述

subject = Subject.objects.get(no=1)
t1 = Teacher(name='甲1', sex="1",birth="2000-05-02",photo="照片路径",good_count="11",bad_count="0",intro='数学老师', subject=subject )
t1.save()

在这里插入图片描述

subject = Subject.objects.get(no=3)
t2 = Teacher(name='丙3', sex="2",birth="2000-05-02",photo="照片路径",good_count="11",bad_count="0",intro='语文老师', subject=subject )
t2.save()

在这里插入图片描述

subject = Subject.objects.get(no=1)
t3 = Teacher(name='丁4', sex="1",birth="2000-05-02",photo="照片路径",good_count="11",bad_count="0",intro='计算机老师', subject=subject )
t3.save()

在这里插入图片描述

2.删除
subject = Subject.objects.get(no=2)
subject.delete()
# (1, {'polls.Subject': 1})
3.更新
subject = Subject.objects.get(no=1)
subject.name = 'Python全栈+人工智能'
subject.save()

在这里插入图片描述

4.查询
  1. 查询所有对象。
Subject.objects.all()
# <QuerySet [<Subject: Subject object (1)>, <Subject: Subject object (3)>]>
  1. 过滤数据。
# 查询名称为“Python全栈+人工智能”的学科
Subject.objects.filter(name='Python全栈+人工智能')
# <QuerySet [<Subject: Subject object (1)>]>

# 查询名称包含“全栈”的学科(模糊查询)
Subject.objects.filter(name__contains='全栈')
# <QuerySet [<Subject: Subject object (1)>]>
Subject.objects.filter(name__startswith='全栈')
# <QuerySet []>
Subject.objects.filter(name__endswith='全栈')
# <QuerySet []>

# 查询所有热门学科
Subject.objects.filter(is_hot=True)
# <QuerySet [<Subject: Subject object (1)>, <Subject: Subject object (3)>]>

# 查询编号大于3小于10的学科
Subject.objects.filter(no__gt=3).filter(no__lt=10)
# <QuerySet []>
Subject.objects.filter(no__gt=3, no__lt=10)
# <QuerySet []>

# 查询编号在3到7之间的学科
Subject.objects.filter(no__gte=3, no__lte=7)
# <QuerySet [<Subject: Subject object (3)>]>
Subject.objects.filter(no__range=(3, 7))
# <QuerySet [<Subject: Subject object (3)>]>
  1. 查询单个对象。
# 查询主键为1的学科
Subject.objects.get(pk=1)
# <Subject: Subject object (1)>
Subject.objects.get(no=1)
# <Subject: Subject object (1)>
Subject.objects.filter(no=1).first()
# <Subject: Subject object (1)>
Subject.objects.filter(no=1).last()
# <Subject: Subject object (1)>
  1. 排序。
# 查询所有学科按编号升序排列
Subject.objects.order_by('no')
# <QuerySet [<Subject: Subject object (1)>, <Subject: Subject object (3)>]>

# 查询所有部门按部门编号降序排列
Subject.objects.order_by('-no')
# <QuerySet [<Subject: Subject object (3)>, <Subject: Subject object (1)>]>
  1. 切片(分页查询)。
# 按编号从小到大查询前3个学科
Subject.objects.order_by('no')[:3]
# <QuerySet [<Subject: Subject object (1)>, <Subject: Subject object (3)>]>
  1. 计数。
# 查询一共有多少个学科
Subject.objects.count()
# 2
  1. 高级查询。
# 查询编号为1的学科的老师
Teacher.objects.filter(subject__no=1)
# <QuerySet [<Teacher: Teacher object (1)>, <Teacher: Teacher object (3)>]>

Subject.objects.get(pk=1).teacher_set.all() 
# Subject.objects.get(pk=1).teacher_set.all() 

# 查询学科名称有“全栈”二字的学科的老师
Teacher.objects.filter(subject__name__contains='全栈') 
# <QuerySet [<Teacher: Teacher object (1)>, <Teacher: Teacher object (3)>]>

说明1:由于老师与学科之间存在多对一外键关联,所以能通过学科反向查询到该学科的老师(从一对多关系中“一”的一方查询“多”的一方),反向查询属性默认的名字是类名小写_set(如上面例子中的teacher_set),当然也可以在创建模型时通过ForeingKey的related_name属性指定反向查询属性的名字。如果不希望执行反向查询可以将related_name属性设置为’+‘或者以’+'开头的字符串。
说明2:ORM查询多个对象时会返回QuerySet对象,QuerySet使用了惰性查询,即在创建QuerySet对象的过程中不涉及任何数据库活动,等真正用到对象时(对QuerySet求值)才向数据库发送SQL语句并获取对应的结果,这一点在实际开发中需要引起注意!
说明3:如果希望更新多条数据,不用先逐一获取模型对象再修改对象属性,可以直接使用QuerySet对象的update()方法一次性更新多条数据。

总结

本文主要是Django系列博客。本文是Django模型层models的使用过程。
1.创建数据库
2.创建表
3.按照MySQL依赖
4.修改settings.py文件,添加应用配置数据库
5.基于数据库生成实体类
6.使用shell完成CRUD操作

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

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

相关文章

代数小课堂:向量代数(方向比努力更重要)

文章目录 引言I 数字的方向性1.1 箱子受力1.2 爆破逃离方向II 向量的表示法2.1 极坐标方法对向量表示2.2 终点的坐标表示向量III 向量的计算3.1 计算向量的长度和方向3.2 平行四边形法则(计算向量的长度)引言 代数学除了带来了方程和函数工具,还揭示了关于数字的另一个规律,…

C++——特殊类设计

目录 不能被拷贝的类 只能在堆上创建对象的类 只能在栈上创建对象的类 不能被继承的类 只能创建一个对象的类(单例模式) 饿汉模式 懒汉模式 单例对象释放问题 不能被拷贝的类 C98&#xff1a;将拷贝构造函数与赋值运算符重载只声明不定义&#xff0c;并且将其访问权…

React Native学习笔记(2.基本语法-类组件)

1. 基本语法 (1). 引入组件。(2). 继承共通。(3). 定义render函数。(4). 返回文本。(5). export导出 2. 自定义组件&#xff08;引用&#xff09; 将上面定义的"cat“组件引用到当前文件里 (1). inprot引入。(2). 使用 3. 自定义组件&#xff08;参数定义与传参&#x…

【Linux】项目自动化构建工具——make/Makefile

目录 1.make与Makefile的关系 Makefile make 项目清理 clean .PHONY 当我们编写一个较大的软件项目时&#xff0c;通常需要将多个源文件编译成可执行程序或库文件。为了简化这个过程&#xff0c;我们可以使用 make 工具和 Makefile 文件。Makefile 文件可以帮助我们自动…

你知道Java中的JCP, JEP, JLS, JSR是什么意思吗?

目录 一、JCP 二、JSR 三、JLS 四、JEP 公众号&#xff1a;MCNU云原生&#xff0c;欢迎微信搜索关注&#xff0c;更多干货&#xff0c;及时掌握。 JCP, JEP, JLS, JSR这些概念是Java社区中的一些概念&#xff0c;但是没有没有经常关注社区的童鞋们未必知道这些缩写所代表的…

centos7搭建FTP

1.简介文件传输协议&#xff08;File Transfer Protocol&#xff0c;FTP&#xff09;是用于在网络上进行文件传输的一种协议&#xff0c;工作于OSI&#xff0c;TCP的应用层&#xff0c;客户端和服务端之前连接要经过一次TCP的三次握手&#xff0c;其作用就是可以使用户以文件操…

第十二章 实现shallowReadonly功能

实现shallowReadonly功能 shallowReadonly&#xff1a; 让一个响应式数据变为只读的(浅只读) 接下来附上测试用例&#xff1a; import { isReadonly,shallowReadonly } from "../reactive"describe(shallowReadonly,()>{test(should not make non-reactive pro…

Session会话管理

会话管理Web会话管理概述常见的Web应用会话管理方式基于Server端的Session的管理方式基于Cookie的Session的管理方式Cookie与Session最大的区别Cookie-Based的管理方式基于Token-Based的管理方式Web会话管理的安全问题Web会话管理概述 会话管理&#xff1a;在进行人机交互的时…

java高级篇之三大性质总结:原子性、可见性以及有序性

1. 三大性质简介 在并发编程中分析线程安全的问题时往往需要切入点&#xff0c;那就是两大核心&#xff1a;JMM抽象内存模型以及happens-before规则&#xff08;在这篇文章中已经经过了&#xff09;&#xff0c;三条性质&#xff1a;原子性&#xff0c;有序性和可见性。关于sy…

JavaSE:常用类

前言从现在开始进入高级部分的学习&#xff0c;鼓励自己一下&#xff01;画个大饼&#xff1a; 常用类->集合框架->IO流->多线程->网络编程 ->注解与反射->GUI很重要的东西&#xff0c;不能不会&#xff01;Object类祖宗类&#xff0c;主要方法&#xff1a;t…

接口测试简介

接口测试简介 接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。 测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系等。 ——百度百科&#xff01; …

低代码开发与传统开发有什么不同?有什么价值?

低代码开发与传统开发有些什么不同&#xff1f;有什么价值&#xff1f; 自2014年Forrester明确提出低代码&#xff08;Low-Code&#xff09;概念以来&#xff0c;这一领域已经逐步升温。近年来&#xff0c;低代码凭借其低开发门槛和易用性等优点赢得了众多投资研究机构和企业用…

设计模式(十四)----结构型模式之组合模式

1 概述 对于这个图片肯定会非常熟悉&#xff0c;上图我们可以看做是一个文件系统&#xff0c;对于这样的结构我们称之为树形结构。在树形结构中可以通过调用某个方法来遍历整个树&#xff0c;当我们找到某个叶子节点后&#xff0c;就可以对叶子节点进行相关的操作。可以将这颗树…

Cookie原理及JAVA端关于Cookie的增删改查操作

什么是Cookie 在java中&#xff0c;Cookie是来自于Servlet规范中一个工具类&#xff0c;存在于Tomcat提供servlet-api.jar中Cookie存放当前用户的私人数据 Cookie原理 用户打开浏览器第一次&#xff08;指每次重新打开浏览器的第一次&#xff0c;而非指历来第一次&#xff0…

ChatGPT可以作为一个翻译器吗?

论文地址&#xff1a;https://arxiv.org/abs/2301.08745.pdf 背景 自从OpenAI2022年11月30日发布ChatGPT以来&#xff0c;基本上把NLP所有任务大统一了&#xff0c;那么在机器翻译的表现到底如何呢&#xff1f;腾讯AI Lab在翻译Prompt、多语言翻译以及翻译鲁棒性三方面做了一…

365天深度学习训练营-第J4周:ResNet与DenseNet结合探索

目录 一、前言 二、论文解读 三、DPN代码复现 四、总结 一、前言 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊|接辅导、项目定制● 难度&#xff1a;夯实基础⭐⭐ ● 语言&#xff1a;Python3、Pytorc…

难道ERP"死了",中台"凉了",低/无代码要称王了?

一句&#xff1a;“不上ERP等死&#xff0c;上了ERP找死”&#xff0c;可把ERP的尴尬处境说透了。 有人把ERP奉为信仰&#xff1a;“那些说ERP不好用的根本是没用明白。” 有人则认为ERP只是卖概念&#xff0c;冷嘲&#xff1a;“实施ERP的企业&#xff0c;估计一半都倒闭了。…

JavaSE-集合框架013-队列Queue及双端队列Deque

原文链接 Queue 我们可以把LinkedList当作队列来用&#xff0c;也可以当作链表来用。LinkedList只是一个实现方式&#xff0c;但是可以具备很多特点 虽然他是一个链表&#xff0c;但是当你从后加从前取&#xff0c;就是队列&#xff08;Queue&#xff09;。当你从后加从后取&a…

第七章 实现effect的stop功能

实现effect的stop功能 通过stop函数传入effect返回的runner 再次修改响应式对象的值的时候 不会修改成功 其实主要思路就是在调用stop函数的时候将 收集的effect依赖移除掉 老样子先给上测试用例&#xff1a; it(stop,()>{// 通过stop函数传入effect返回的runner 再次修…

JPG格式图片怎么弄?可以试试这些途径

在日常生活中&#xff0c;我们经常需要将图片转换为JPG格式&#xff0c;以便在各种设备上使用&#xff0c;因为 JPG 是一种常用的图像格式&#xff0c;具有广泛的兼容性和易用性。这里将介绍几种简单的方法&#xff0c;以帮助您将图片转换为JPG格式。方法一、使用格式转换软件转…