Django模型进阶

一.配置MySQL

1.安装mysql

2.mysql驱动

使用mysqlclient

pip install mysqlclient

如果上面的命令安装失败,则尝试使用国内豆瓣源安装:
        pip install -i https://pypi.douban.com/simple mysglclien
        (Linux Ubuntu下需要先安装:apt install libmysqld-dev

                                        再安装:apt install libmysqld-dev)

2,在Django中配置和使用mysql数据库

使用mysql数据库,settings中配置如下
        DATABASES ={
                Default': {
                        'ENGINE':'django.db.backends.mysql',
                        'NAME':'mydb'
                        'USER':'root',
                        'PASSWORD':'123456'
                        'HOST':'127.0.0.1'
                        'PORT':'3306',

                }

        }

将mysql数据库的配置到settings.py文件里

学习的时候可以自己新建一个数据库

我在这边创建了一个新的数据库名字为modeldb1在创建的时候注意最后的分号

mysql> create database modeldb1 charset=utf8;

我们尝试执行以下数据迁移

生成迁移文件:python manage.py makemigrations
执行迁移文件:python manage.py migrate

再查看一下modlesdb1 已经成功将数据库迁移进去了

这样我们就将mysql配置成功了

二.多模块关联关系

多个模块关联
        关联分类
                ForeignKey:一对多,将字段定义在多的端中
                ManyToManyField:多对多,将字段定义在两端的任意一端中
                0neTo0neField:-对一,将字段定义在任意一端中
一对多关系,举例说明(一对一, 多对多类似):
        一个学生只能属于一个班级,一个班级可以有多个学生

        class Grade(models.Model):

                        name = models.CharField(max length=20)

         class Student(models.Model):
                name = models.CharField(max length=20)

                grade = models.ForeignKey(Grade)
对象的使用:
        正向(在student这边,有grade属性的这一边):

              获取学生所在班级(对象):stu.grade

                获取学生所在班级的属性:stu.grade.name

        反向(在Grade这边):
                获取班级的所有学生(获取Manager对象):grade.student_set

                获取班级的所有学生(获取QuerySet查询集):grade.student_set.all()
        filter(),get()等操作中的使用:
                正向(在student这边,有grade属性的这一边):

                 Student.objects.filter(属性_name='1')

                如:Student.objects.filter(grade_name='1')

        反向(在Grade这边):
                Grade.objects.filter(类名小写_id=7)

                如:Grade.objects.filter(student_id=7)

 

三.modle连表结构

一对多:models.ForeignKey(其他表)
多对多:models.ManyToManyField(其他表)
一对一:models.0neTo0neField(其他表)
应用场景:
        一对多:当一张表中创建一行数据时,有一个单选的下拉框(可以被重复选择)

                例如:创建用户信息时候,需要选择一个用户头型【普通用户】【金牌用户】【铂金用户】

        多对多:在某表中创建一行数据时,有一个可以多选的下拉框。(猫眼App,淘票票,格拉瓦电影)

                例如:创建用户信息,需要为用户指定多个爱好

        一对一:在某表中创建一行数据时,有一个单选的下拉框(下拉框中的内容被用过一次就消失了)

                例如:有个身份证表,有个person表。每个人只能有一张身份证,一张身份证也只能对应一个人,这就是一对一关系。

一对多关联

一对多关系,即外键
        为什么要用一对多。先来看一个例子。有一个用户信息表,其中有个用户类型字段,存储用户的用户类型。如下:

        class UserInfo(models.Model):
        username = models.CharField(max length=32)

        age = models.IntegerField()
        user type = models.CharField(max length=10)

        不使用外键时用户类型存储在每一行数据中。如使用外键则只需要存储关联表的id即可,能够节省大量的存储空同时使用外键有利于维持数据完整性和一致性。

当然也有缺点,数据库设计变的更复杂了。每次做DELETE 或者UPDATE都必须考虑外键约束
刚才的例子使用外键的情况:单独定义一个用户类型表:
        class UserType(models.Model):

                caption = models.CharField(max length=32)
        class UserInfo(models.Model):

                user type = models.ForeignKey('UserType')

                username = models.CharField(max length=32)

                age = models.IntegerField()
我们约定:
        正向操作:ForeignKey在UserInfo表里,如果根据UserInfo去操作就是正向操作。
        反向操作:ForeignKey不在UserType里,如果根据UserType去操作就是反向操作。

创建一个一对多的模型

1.增加数据

 同样执行一下数据迁移操作

生成迁移文件:python manage.py makemigrations
执行迁移文件:python manage.py migrate

 可以进入到数据库看一下 在App_user中有一个user_type_id

添加一下路由

执行一次

可以看到数据库里已经成功添加了一些数据

给user表中也添加一些数据

或者用另一种方式添加,也是可以

2.删除数据

在一对多的表结构中删除用户表里面的数据对用户类型表是不受影响的

id=3的那条数据已经被删除

如果删除用户类型里的数据会将对应的用户表里对应的数据删除

UserType.objects.filter(id=4).delete()

 

删除操作可以在定义外键关系的时候,通过on_delete参数来配置删除时做的操作。

on_delete参数主要有以下几个可选值:
        models.CASCADE:默认值(Django1.11),表示级联删除,即删除UserType时相关联的User也会被删除。
       models.PROTECT 保护模式, 阻止级联删除。

        models.SET_NULL 置空模式,设为null,null=True参数必须具备

        models.SET_DEFAULT 置默认值 设为默认值,default参数必须具备

        models.SET()删除的时候重新动态指向一个实体访问对应元素,可传函数

        models.DO_NOTHING 什么也不做。(Django1.11)

注意:修改on_delete参数之后需要重新同步数据库,如果使用

3.修改数据

修改相对来说比较简单,先找到想要修改的数据再进行updata

下一节再进行查询方式的学习

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

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

相关文章

[C语言知识]return和exit到底有什么区别?

前言 💖💖💖欢迎来到我的博客,我是anmory💖💖💖 又和大家见面了 欢迎来到C语言知识系列 用通俗易懂的语言让编程语言不再困难 先来自我推荐一波 个人网站欢迎访问以及捐款 推荐阅读 如何低成本搭…

Spring @Repository 注解

Spring 的项目严重依赖注解。 Repository 注解 在Spring2.0之前的版本中,Repository注解可以标记在任何的类上,用来表明该类是用来执行与数据库相关的操作(即dao对象),并支持自动处理数据库操作产生的异常 在Spring2.5版本中,引…

Today At Apple 2024.04.20 ipad 绘画 图片管理

文章目录 recreate 软件 绘画图片管理 官网: https://www.apple.com/today/Apple 亚洲第一大商店:Apple 静安零售店现已在上海开幕如下预约课程:下载 Apple Store(不是app store),点击课程预约笔记&#xf…

GEVernova推出GEV新能源平台,引领新能源未来

近日,全球领先的能源设备制造和服务公司 GE Vernova 宣布推出 GEV 新能源平台,这是一个将金融、科技和产业深度融合的全新投资平台。GEV 新能源平台旨在为用户提供一站式可持续新能源投资解决方案,助力全球新能源转型和可持续发展。 新能源已…

基于MetaGPT的智能体理论与实践-Task01

Task01: MetaGPT环境配置 学习教程:https://github.com/datawhalechina/hugging-multi-agent 1 环境准备 1.1 安装python3.9 通过:python3 --version, 查看此python版本为3.10.3 1.2 下载MetaGPT 开始,借用清华镜像,拉取…

acw165. 小猫爬山-DFS剪枝与优化

题目 思路 暴搜顺序:从前往后依次枚举每只小猫,枚举当前这只小猫应该放在哪一辆车上,递归完n层之后,就可以知道所有方案中的最少车辆总数剪枝的情况: 优化搜索顺序:大部分情况下,应该优先搜索分…

交易复盘-20240513

仅用于记录当天的市场情况,用于统计交易策略的适用情况,以便程序回测 短线核心:不参与任何级别的调整,采用龙空龙模式 一支股票 10%的时候可以操作, 90%的时间适合空仓等待 双成药业 (1)|[9:30]|[3566万]|0.34 中通客车 (1)|[9:43]|[7678万]|0.15 嘉华股份 (2)|[9:30]|[36…

李飞飞团队关于2024年人工智能发展报告总结 (Artificial Intelligence Index Report)

目录 1 10大核心信息2 AI研究和发展2.1 核心要点2.2 核心对比信息2.3 模型是否会用尽数据2.4 基础模型发展2.5 训练模型成本 3 技术性能3.1 核心要点3.2 重要模型发布情况3.3 AI表现情况3.4 多学科、高难度评估集 (MMMU & GPQA & ARC)3.5 Agents3.6 RLHF & RLAIF3.…

山西教育杂志山西教育杂志社山西教育编辑部2024年第4期目录

课题研究 小学语文随堂小练笔策略研究 陈立固; 3-4 儿童戏剧工作坊载体下小学语文戏剧课堂的建构 郭黎明; 5-6《山西教育》投稿:cn7kantougao163.com 文化生态视域下小学英语教学的传统文化融入 周慧娟; 7-8 基于“主题语境”的初中英语课堂教学研究…

公式识别软件免费的有哪些?简单好用的有三款

公式识别软件免费的有哪些?在数字化时代,公式识别软件已经成为科研、教育等领域不可或缺的工具。这些软件能够准确地将图像中的公式转化为可编辑的文本格式,极大地提高了工作效率。为了帮助大家轻松应对公式识别的挑战,今天本文就…

想要成为项目经理?先掌握这24条职场生存法则!

以下是项目经理的24条职场经验,这些经验涵盖了项目管理的各个方面,希望能对项目经理或有意成为项目经理的人有所启发。 1、明确目标:项目成功的关键在于明确的目标。在项目启动之初,确保所有利益相关者对项目目标有清晰、共同的…

绘制一个单级放大电路原理图过程,保姆级教程

新手在学习pads的使用最好最快的方法就是实际上手去画原理图,画PCB图,在这个过程中,就能够更快速得掌握PADS软件的使用。 本篇就是对于实际画原理图过程的一个记录,手把手教学,如果有纰漏或者有更好的一些技巧&#xf…

【联合索引】最左匹配原则是什么?

什么是联合索引 联合索引(Composite Index)是一种索引类型,它由多个列组成。 MySQL的联合索引(也称为复合索引)是建立在多个字段上的索引。这种索引类型允许数据库在查询时同时考虑多个列的值,从而提高查询…

怎么下载抖音直播视频 怎么解析直播间链接的视频录制保存

尊敬的读者们,你们好!今天我们将探讨一个非常实用的技巧——如何下载直播视频。随着网络技术的发展,直播视频已经成为我们日常生活中不可或缺的一部分。无论是观看比赛、欣赏音乐会还是探索新的美食,直播视频都为我们提供了更直观…

嵌入式数据库概念和基本命令的使用

文章目录 前言一、sqlite数据库概念二、sqlite数据库命令分类和使用1.命令分类1. 系统命令:2. SQLite 命令: 2.系统命令的使用3.sqlite命令的使用 三、sqlite C语言函数的使用和编程方法总结 前言 本篇文章将为大家讲解嵌入式数据库的使用,嵌…

非常简单的长期兼职,无脑复制粘贴,每天稳定200-300+

带货这个概念已经不再陌生,许多人对此产生了浓厚的兴趣。今天,我将向大家介绍一个百家号带货项目,这是我一位朋友正在操作的项目。最近与他交流后,我觉得这个项目具有相当的操作性。他并非只运营了一个账号,而是同时管…

东芝移动硬盘数据恢复方法有哪些

谁能懂我此刻的心情啊!移动硬盘用起来真的超级方便,如今我的工作几乎都离不开它,用来存放各种重要文件。可是,让人头疼的事情发生了,昨天我发现移动硬盘里的部分数据竟然莫名其妙地消失了!这可咋整啊&#…

【GD32】03 - EXTI外部中断

EXTI EXTI,全称External Interrupt/Event Controller,即外部中断/事件控制器,是微控制器中的一个重要组成部分。它主要用于管理来自外部设备的中断和事件请求。以下是关于EXTI的详细介绍: 功能概述: EXTI管理了控制器的…

n的阶乘(函数)(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>//声明n的阶乘函数fac; int fac(int n);int main() {//初始化变量值&#xff1b;int n, result;//获取要阶乘的数&#xff1b;printf("请输入要阶乘的n&…

Python中进程类Process的方法与属性的使用示例

一、示例代码&#xff1a; from multiprocessing import Process import time import osdef child_1(interval):print(子进程&#xff08;%s&#xff09;开始执行&#xff0c;父进程为&#xff08;%s&#xff09; % (os.getpid(), os.getppid()))t_start time.time()time.sle…