Django开发--step2 数据库操作

2024-01-10 01:58

本文主要是介绍Django开发--step2 数据库操作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、博客系统数据库设计
博客文章表
1. ID  | 标题   | 正文  |  发表时间   | 分类  |  标签
2. ID  | 分类名
3. ID  | 标签名
表中最起码有这些内容

二、编写博客模型代码
例如我们的分类数据库表,Django 只要求我们这样写:

blogapp/models.py

from django.db import modelsclass Category(models.Model):name = models.CharField(max_length=100)


Category 就是一个标准的 Python 类,它继承了 models.Model 类,类名为 Category 。Category 类有一个属性 name,它是 models.CharField 的一个实例。

这样,Django 就可以把这个类翻译成数据库的操作语言,在数据库里创建一个名为 category 的表格,这个表格的一个列名为 name。还有一个列 id,Django 则会自动创建。可以看出从 Python 代码翻译成数据库语言时其规则就是一个 Python 类对应一个数据库表格,类名即表名,类的属性对应着表格的列,属性名即列名。

上述操作数据库的方法叫做ORM,是django设计的一套python对象与数据库的映射系统,使得开发者可以不用SQL语句就能实现及其复杂的数据库操作,ORM框架为每个表对应的类都生成了objects对象(如果你没有显式指定表的Manager的话),而这个objects对象拥有操作表的所有方法,诸如批量查询filter、单次查询get、更新update等。所以当我们执行SQL操作时,比如查询整表,可以如下:

articles = Article.objects.all()

上述代码返回了表中的所有行,注意在代码中:

  • ForeignKey: 一对多, 将该属性定义到多的那一端
  • OneToOneField: 一对一, 将该属性定义到任一端
  • ManyToManyField: 多对多, (将该属性定义到两端),多对多关系会自动生成一张表

 

三、Django完成翻译-迁移数据库

以上我们编写的知识python代码,django还没有把它翻译为数据库语言,因此数据库表还没有在真正的数据库中创建

什么是数据库迁移?
当我们在看关于web开发的教程时,教程在设计数据表时,不是一下子就设计好的,而是先设计一个能用的数据表,然后再慢慢的往里面增加东西。当我们往表里面增加东西时,比如说增加一个字段,那么之前的数据怎么办?
这时候就要用到数据库迁移了,在数据表进行更新时,可以利用数据库迁移脚本在当前数据表进行更新,而不是重新创建一个数据表。

在django中的数据库迁移需要前后执行两个命令:

python manage.py makemigrations

   和  

 python manage.py migrate

执行第一个命令---》生成迁移文件

执行第二个命令---》生成数据库表

当我们执行了 python manage.py makemigrations 后,Django 在 blog 应用的 migrations\ 目录下生成了一个 0001_initial.py 文件,这个文件是 Django 用来记录我们对模型做了哪些修改的文件。目前来说,我们在 models.py 文件里创建了 3 个模型类,Django 把这些变化记录在了 0001_initial.py 里。

不过此时还只是告诉了 Django 我们做了哪些改变,为了让 Django 真正地为我们创建数据库表,接下来又执行了 python manage.py migrate 命令。Django 通过检测应用中 migrations\ 目录下的文件,得知我们对数据库做了哪些操作,然后它把这些操作翻译成数据库操作语言,从而把这些操作作用于真正的数据库。

你可以看到命令的输出除了 Applying blog.0001_initial... OK 外,Django 还对其它文件做了操作。这是因为除了我们自己建立的 blog 应用外,Django 自身还内置了很多应用,这些应用本身也是需要存储数据的。可以在 settings.py 的 INSTALLED_APP 设置里看到这些应用,当然我们目前不必关心这些。

只要模型类涉及到结构改变都要重新执行两个迁移命令

当我们执行 :::

python manage.py sqlmigrate blogapp 0001

可以看到django究竟为我们做了什么

BEGIN;
--
-- Create model Category
--
CREATE TABLE "blogapp_category" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(100) NOT NULL);
--
-- Create model Post
--
CREATE TABLE "blogapp_post" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "title" varchar(70) NOT NULL, "body" text NOT NULL, "created_time" datetime NOT NULL,"modified_time" datetime NOT NULL, "excerpt" varchar(200) NOT NULL, "author_id" integer NOT NULL REFERENCES "auth_user" ("id"), "category_id" integer NOT NULL REF
ERENCES "blogapp_category" ("id"));
--
-- Create model Tag
--
CREATE TABLE "blogapp_tag" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(100) NOT NULL);
--
-- Add field tags to post
--
CREATE TABLE "blogapp_post_tags" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "post_id" integer NOT NULL REFERENCES "blogapp_post" ("id"), "tag_id" integer NO
T NULL REFERENCES "blogapp_tag" ("id"));
CREATE INDEX "blogapp_post_4f331e2f" ON "blogapp_post" ("author_id");
CREATE INDEX "blogapp_post_b583a629" ON "blogapp_post" ("category_id");
CREATE UNIQUE INDEX "blogapp_post_tags_post_id_3c6dd183_uniq" ON "blogapp_post_tags" ("post_id", "tag_id");
CREATE INDEX "blogapp_post_tags_f3aa1999" ON "blogapp_post_tags" ("post_id");
CREATE INDEX "blogapp_post_tags_76f094bc" ON "blogapp_post_tags" ("tag_id");
COMMIT;

sqlite和mysql数据库的区别  本项目使用的是sqlite3 ,在项目的根目录下显示有数据库 db.sqlite3

 

四、用django的方式操作数据库

对数据库的操作无非是增删改查

(blog_venv) D:\python_study2019\blog>python manage.py shell
Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
# 增加数据
>>> from blogapp.models import Category, Tag, Post
>>> c=Category(name='category test')
>>> c.save()
>>> t=Tag(name='tag test')
>>> t.save()
>>> quit()# 创建用户
(blog_venv) D:\python_study2019\blog>python manage.py createsuperuser
Username (leave blank to use 'dell'): slyslyme
Email address: slyslyme@163.com
Password:
Password (again):
Superuser created successfully.(blog_venv) D:\python_study2019\blog>python manage.py shell
Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from blog.models import Category, Tag, Post
Traceback (most recent call last):File "<console>", line 1, in <module>
ModuleNotFoundError: No module named 'blog.models'
>>> from blogapp.models import Category, Tag, Post
>>> from django.utils import timezone
>>> from django.contrib.auth.models import User
>>> user=User.objects.get(username='slyslyme')
>>> c=Category.objects.get(name='category test')
>>> p=Post(title='title test',body='body test', created_time=timezone.now(), modified_time=timezone.now(), category=c, author=user)
>>> p.save()
>>> Category.objects.all()
<QuerySet [<Category: Category object>]>然后在三个模型代码中各添加了def __str__(self):return self.namenow exiting InteractiveConsole...(blog_venv) D:\python_study2019\blog>python manage.py shell
Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)# 查询全部
>>> from blogapp.models import Category, Tag, Post
>>> Category.objects.all()
<QuerySet [<Category: category test>]>
>>> Tag.objects.all()
<QuerySet [<Tag: tag test>]># 修改数据
>>> c=Category.objects.get(name='category test')
>>> c.name='category test new'
>>> c.save()
>>> Category.objects.all()
<QuerySet [<Category: category test new>]>
>>> c=Category(name='category test')
>>> c.save()
>>> Category.objects.all()
<QuerySet [<Category: category test new>, <Category: category test>]># 删除数据
>>> c=Category.objects.get(name='category test new')
>>> c
<Category: category test new>
>>> c.delete()
(2, {'blogapp.Post_tags': 0, 'blogapp.Post': 1, 'blogapp.Category': 1})
>>> Category.objects.all()
<QuerySet [<Category: category test>]>

 

若在运行时报错

    category = models.ForeignKey(Category)
TypeError: __init__() missing 1 required positional argument: 'on_delete'


则将外键修改为

category = models.ForeignKey(Category,on_delete=models.CASCADE)

这篇关于Django开发--step2 数据库操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/589167

相关文章

Python调用Orator ORM进行数据库操作

《Python调用OratorORM进行数据库操作》OratorORM是一个功能丰富且灵活的PythonORM库,旨在简化数据库操作,它支持多种数据库并提供了简洁且直观的API,下面我们就... 目录Orator ORM 主要特点安装使用示例总结Orator ORM 是一个功能丰富且灵活的 python O

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型的操作流程

《0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeekR1模型的操作流程》DeepSeekR1模型凭借其强大的自然语言处理能力,在未来具有广阔的应用前景,有望在多个领域发... 目录0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型,3步搞定一个应

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多

轻松上手MYSQL之JSON函数实现高效数据查询与操作

《轻松上手MYSQL之JSON函数实现高效数据查询与操作》:本文主要介绍轻松上手MYSQL之JSON函数实现高效数据查询与操作的相关资料,MySQL提供了多个JSON函数,用于处理和查询JSON数... 目录一、jsON_EXTRACT 提取指定数据二、JSON_UNQUOTE 取消双引号三、JSON_KE

MySQL数据库函数之JSON_EXTRACT示例代码

《MySQL数据库函数之JSON_EXTRACT示例代码》:本文主要介绍MySQL数据库函数之JSON_EXTRACT的相关资料,JSON_EXTRACT()函数用于从JSON文档中提取值,支持对... 目录前言基本语法路径表达式示例示例 1: 提取简单值示例 2: 提取嵌套值示例 3: 提取数组中的值注意

查询SQL Server数据库服务器IP地址的多种有效方法

《查询SQLServer数据库服务器IP地址的多种有效方法》作为数据库管理员或开发人员,了解如何查询SQLServer数据库服务器的IP地址是一项重要技能,本文将介绍几种简单而有效的方法,帮助你轻松... 目录使用T-SQL查询方法1:使用系统函数方法2:使用系统视图使用SQL Server Configu

C++实现封装的顺序表的操作与实践

《C++实现封装的顺序表的操作与实践》在程序设计中,顺序表是一种常见的线性数据结构,通常用于存储具有固定顺序的元素,与链表不同,顺序表中的元素是连续存储的,因此访问速度较快,但插入和删除操作的效率可能... 目录一、顺序表的基本概念二、顺序表类的设计1. 顺序表类的成员变量2. 构造函数和析构函数三、顺序表