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

相关文章

SQL Server修改数据库名及物理数据文件名操作步骤

《SQLServer修改数据库名及物理数据文件名操作步骤》在SQLServer中重命名数据库是一个常见的操作,但需要确保用户具有足够的权限来执行此操作,:本文主要介绍SQLServer修改数据... 目录一、背景介绍二、操作步骤2.1 设置为单用户模式(断开连接)2.2 修改数据库名称2.3 查找逻辑文件名

SQL Server数据库死锁处理超详细攻略

《SQLServer数据库死锁处理超详细攻略》SQLServer作为主流数据库管理系统,在高并发场景下可能面临死锁问题,影响系统性能和稳定性,这篇文章主要给大家介绍了关于SQLServer数据库死... 目录一、引言二、查询 Sqlserver 中造成死锁的 SPID三、用内置函数查询执行信息1. sp_w

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

使用Python开发一个现代化屏幕取色器

《使用Python开发一个现代化屏幕取色器》在UI设计、网页开发等场景中,颜色拾取是高频需求,:本文主要介绍如何使用Python开发一个现代化屏幕取色器,有需要的小伙伴可以参考一下... 目录一、项目概述二、核心功能解析2.1 实时颜色追踪2.2 智能颜色显示三、效果展示四、实现步骤详解4.1 环境配置4.

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用

Linux链表操作方式

《Linux链表操作方式》:本文主要介绍Linux链表操作方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、链表基础概念与内核链表优势二、内核链表结构与宏解析三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势六、典型应用场景七、调试技巧与

Python使用smtplib库开发一个邮件自动发送工具

《Python使用smtplib库开发一个邮件自动发送工具》在现代软件开发中,自动化邮件发送是一个非常实用的功能,无论是系统通知、营销邮件、还是日常工作报告,Python的smtplib库都能帮助我们... 目录代码实现与知识点解析1. 导入必要的库2. 配置邮件服务器参数3. 创建邮件发送类4. 实现邮件

Java Multimap实现类与操作的具体示例

《JavaMultimap实现类与操作的具体示例》Multimap出现在Google的Guava库中,它为Java提供了更加灵活的集合操作,:本文主要介绍JavaMultimap实现类与操作的... 目录一、Multimap 概述Multimap 主要特点:二、Multimap 实现类1. ListMult

Python中文件读取操作漏洞深度解析与防护指南

《Python中文件读取操作漏洞深度解析与防护指南》在Web应用开发中,文件操作是最基础也最危险的功能之一,这篇文章将全面剖析Python环境中常见的文件读取漏洞类型,成因及防护方案,感兴趣的小伙伴可... 目录引言一、静态资源处理中的路径穿越漏洞1.1 典型漏洞场景1.2 os.path.join()的陷

基于Python开发一个有趣的工作时长计算器

《基于Python开发一个有趣的工作时长计算器》随着远程办公和弹性工作制的兴起,个人及团队对于工作时长的准确统计需求日益增长,本文将使用Python和PyQt5打造一个工作时长计算器,感兴趣的小伙伴可... 目录概述功能介绍界面展示php软件使用步骤说明代码详解1.窗口初始化与布局2.工作时长计算核心逻辑3