在django开发中,一般我们初始化一个项目之后,创建应用一般就会生成如下的目录:

django-admin startproject myproject
python manage.py startapp blog
myproject/
├── manage.py
└── myproject/
|    ├── __init__.py
|    ├── settings.py
|    ├── urls.py
|    └── wsgi.py
|___blog|___models.py|___......

其中model.py就是定义数据库表的文件。文件中的每个类就是就对应的数据库中的每张表。

比如models.py里面有如下一个类和对应的数据库中的关系如下所示:

from django.db import modelsclass BlogPost(models.Model):"""博客文章模型类数据库中对应的表名为: blog_post (Django 自动将类名转换为小写并用下划线连接)"""title = models.CharField(max_length=200, verbose_name="文章标题")# 数据库对应: VARCHAR(200) 字段,NOT NULL 约束content = models.TextField(verbose_name="文章内容")# 数据库对应: TEXT 字段,NOT NULL 约束author = models.ForeignKey('auth.User',on_delete=models.CASCADE,verbose_name="作者")# 数据库对应: 外键字段,关联到 auth_user 表的 id 字段# 实际存储为 author_id 整数列created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")# 数据库对应: DATETIME 字段,NOT NULL# 仅在对象首次创建时自动设置为当前时间updated_at = models.DateTimeField(auto_now=True, verbose_name="更新时间")# 数据库对应: DATETIME 字段,NOT NULL# 每次保存对象时自动更新为当前时间is_published = models.BooleanField(default=False, verbose_name="是否发布")# 数据库对应: BOOLEAN/TINYINT(1) 字段,默认值为 0 (False)class Meta:verbose_name = "博客文章"verbose_name_plural = "博客文章"ordering = ['-created_at']# 数据库对应: 表将按 created_at 降序排列

执行

 python manage.py makemigrations python migrate 

这里执行makemigrations的作用就在在对应的app目录下面生成migrations目录,里面会有一些python文件,记录了对model.py的修改。相当于git可以对models.py的每次修改做checkpoint。 举个例子。比如我在models.py里面第一次创建了数据库类,执行了makemigrations命令,这样就会在对应的migrations目录下面生成一个pyhton文件,编号从0001_.......py开始记录这一次的改动。后来我又修改了model.py里面的一些字段的命名。执行了makemigrations命令,这样就又会生成第二个0002_.......py文件。里面保存了这次对于这些字段修改的checkpoint。同时在django中,这个下面生成的文件名是易读的,可以从文件名大概知道改动的内容。

第二个执行完makemigrations命令之后,执行migrate就是把生成的哪些编号从0001开始的哪些文件的改动,同步到数据库中,该建表的建表。该修改字段的修改字段等等。这一步就是对数据库真正产生影响的步骤。

所以这里在做数据库迁移的时候,如果遇到迁移失败,我们是其实可以像git一样,回退迁移文件到最开始的时候也就是__inti__.py的时候,然后直接重新生成迁移文件,在做迁移

比如上面的代码执行之后,最后会在数据库中创建以下结构的表:

1.表名:blog_post2.字段:id (自动创建的主键,INTEGER PRIMARY KEY AUTOINCREMENT)title (VARCHAR(200) NOT NULL)content (TEXT NOT NULL)author_id (INTEGER NOT NULL, 外键关联到 auth_user 表)created_at (DATETIME NOT NULL)updated_at (DATETIME NOT NULL)is_published (BOOLEAN/TINYINT(1) NOT NULL, 默认 0)3.外键约束:FOREIGN KEY(author_id) REFERENCES auth_user(id) ON DELETE CASCADE

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

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

相关文章

C++STL系列之vector

前言 vector是变长数组,有点像数据结构中的顺序表,它和list也是经常被拿出作对比的, vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小,如果扩容,因为要开一个新数组把…

Functional C++ for Fun Profit

Lambda Conf上有人讲C函数式编程。在Functional Conf 2019上,就有主题为“Lambdas: The Functional Programming Companion of Modern C”的演讲。演讲者介绍了现代C中函数式编程相关内容,讲解了如何使用Lambda表达式编写符合函数式编程原则的C代码&…

Python基础理论与实践:从零到爬虫实战

引言Python如轻舟,载你探寻数据宝藏!本文从基础理论(变量、循环、函数、模块)启航,结合requests和BeautifulSoup实战爬取Quotes to Scrape,适合零基础到进阶者。文章聚焦Python基础(变量、循环、…

ThingJS开发从入门到精通:构建三维物联网可视化应用的完整指南

文章目录第一部分:ThingJS基础入门第一章 ThingJS概述与技术架构1.1 ThingJS平台简介1.2 技术架构解析1.3 开发环境配置第二章 基础概念与核心API2.1 核心对象模型2.2 场景创建与管理2.3 对象操作基础第三章 基础开发实战3.1 第一个ThingJS应用3.2 事件系统详解3.3 …

关于list

1、什么是listlist是一个带头结点的双向循环链表模版容器,可以存放任意类型,需要显式定义2、list的使用有了前面学习string和vector的基础,学习和使用list会方便很多,因为大部分的内容依然是高度重合的。与顺序表不同,…

Mysql 查看当前事务锁

在 MySQL 中查看事务锁(锁等待、锁持有等),可以使用以下方法: 一、查看当前锁等待情况(推荐) SELECTr.trx_id AS waiting_trx_id,r.trx_mysql_thread_id AS waiting_thread,r.trx_query AS waiting_query,b…

【Keil5-map文件】

Keil5-map文件■ map文件■ map文件

k8s 基本架构

基于Kubernetes(K8s)的核心设计,以下是其关键基本概念的详细解析。这些概念构成了K8s容器编排系统的基石,用于自动化部署、扩展和管理容器化应用。### 一、K8s核心概念概览 K8s的核心对象围绕容器生命周期管理、资源调度和服务发现展开,主要包…

Bell不等式赋能机器学习:微算法科技MLGO一种基于量子纠缠的监督量子分类器训练算法技术

近年来,量子计算(Quantum Computing) 和 机器学习(Machine Learning) 的融合成为人工智能和计算科学领域的重要研究方向。随着经典计算机在某些复杂任务上接近计算极限,研究人员开始探索量子计算的独特优势…

Edge浏览器设置网页自动翻译

一.浏览网页自动翻译设置->扩展->获取Microsoft Edge扩展->搜索“沉浸式翻译”->获取 。提示:如果采用其他的翻译扩展没找自动翻译功能,所以这里选择“沉浸式翻译”二.基于Java WebElement时自动翻译Java关键代码:提示&#xff1…

TCP/UDP协议深度解析(四):TCP的粘包问题以及异常情况处理

🔍 开发者资源导航 🔍🏷️ 博客主页: 个人主页📚 专栏订阅: JavaEE全栈专栏 本系列往期内容~ TCP/UDP协议深度解析(一):UDP特性与TCP确认应答以及重传机制 TCP/UDP协议深…

R 基础语法

R 基础语法 R 语言是一种针对统计计算和图形表示而设计的编程语言,广泛应用于数据分析、统计学习、生物信息学等领域。本文将为您介绍 R 语言的基础语法,帮助您快速入门。 1. R 语言环境搭建 在开始学习 R 语言之前,您需要安装并配置 R 语言环…

语义熵怎么增强LLM自信心的

语义熵怎么增强LLM自信心的 一、传统Token熵的问题(先理解“痛点”) 比如模型回答“阿司匹林是否治疗头痛?”→ 输出“是” 传统Token熵:只看“词的概率”,比如“是”这个词的概率特别高(Token熵0.2,数值低说明确定性强 )。 但实际风险:医学场景里,“是”的字面肯定…

javaweb的几大常见漏洞

CTF javaweb中几大常见漏洞(基于java-security靶场) 对于CTF而言,java类型的题目基本都是白盒代码审计,在java类型的web题目增长的今天,java代码审计能力在ctf比赛中尤为重要。 这篇博客主要是给大家介绍一下一些常见漏洞在java代码里面大概是…

【设计模式C#】外观模式(用于解决客户端对系统的许多类进行频繁沟通)

一种结构性设计模式。特点是将复杂的子系统调用逻辑封装到一个外观类,从而使客户端更容易与系统交互。优点:简化了接口的调用;降低了客户端与子系统的耦合度;封装了子系统的逻辑。缺点:引入了额外的类,可能…

【PTA数据结构 | C语言版】二叉堆的快速建堆操作

本专栏持续输出数据结构题目集,欢迎订阅。 文章目录题目代码题目 请编写程序,将 n 个顺序存储的数据用快速建堆操作调整为最小堆;最后顺次输出堆中元素以检验操作的正确性。 输入格式: 输入首先给出一个正整数 c(≤1…

【数据结构初阶】--双向链表(二)

🔥个人主页:草莓熊Lotso 🎬作者简介:C研发方向学习者 📖个人专栏: 《C语言》 《数据结构与算法》《C语言刷题集》《Leetcode刷题指南》 ⭐️人生格言:生活是默默的坚持,毅力是永久的…

vue-cli 模式下安装 uni-ui

目录 easycom 自定义easycom配置的示例 npm安装 uni-ui 准备 sass 安装 uni-ui 注意 easycom 传统vue组件,需要安装、引用、注册,三个步骤后才能使用组件。easycom将其精简为一步。 只要组件路径符合规范(具体见下)&#…

JavaSE-接口

概念在Java中,接口可以被看成是一种公共规范,是一种引用数据类型。语法1.接口的定义格式与类的定义格式基本相同,将class关键字替换为interface关键字:public interface IShape {}2.类与接口之间使用implements关键字来实现接口&a…

常用类学习

文章目录字符串相关的类String的特性String对象的创建字符串相关的类String类与其他结构之间的转换StringBuffer,StringBuilderStringBuffer类的常用方法JDK8之前日期时间APIjava.lang.System类java.util.Date类java.text.SimpleDateFormat类java.util.Calendar类JDK8中新日期时…