Django学习笔记教程全解析:初步学习Django模型,初识API,以及Django的后台管理系统(Django全解析,保姆级教程)

把时间用在思考上是最能节省时间的事情。——[美]卡曾斯

导言

写在前面

本文部分内容引用的是Django官方文档,对官方文档进行了解读和理解,对官方文档的部分注释内容进行了翻译,以方便大家的阅读和理解。

概述

在上一篇文章里,我们学习了Django的数据库以及拓展数据库的使用以及设置项。这篇文章,我们开始学习Django的模型、API以及后台管理系统的知识。
在 Django 里写一个数据库驱动的 Web 应用的第一步是定义模型 - 也就是数据库结构设计和附加的其它元数据。关于API,进入交互式 Python 命令行,尝试一下 Django 为你创建的各种 API。

为你的员工或客户生成一个用户添加,修改和删除内容的后台是一项缺乏创造性和乏味的工作。因此,Django 全自动地根据模型创建后台界面。
Django 产生于一个公众页面和内容发布者页面完全分离的新闻类站点的开发过程中。站点管理人员使用管理系统来添加新闻、事件和体育时讯等,这些添加的内容被显示在公众页面上。Django 通过为站点管理人员创建统一的内容编辑界面解决了这个问题。管理界面不是为了网站的访问者,而是为管理者准备的。

学习目标

  1. 认识和学习模型,并初步掌握脚本的编写方法
  2. 学习模型的激活方法,以及运行数据迁移命令
  3. 了解并了解Django的API,了解常用的相关命令
  4. 初步认识后台管理系统,创建Django后台超级管理员以及后台相关知识

模型

概述

一个模型就是单个定义你的数据的信息源。模型中包含了不可缺少的数据区域和你存储数据的行为。在模型中,通过Python类进行描述。
例如,我们现在需要创建两个模型,那么就需要两个Python类,问题 Question 和选项 Choice。Question 模型包括问题描述和发布时间。Choice 模型有两个字段,选项描述和当前得票数。每个选项属于一个问题。

#导入models的包
from django.db import models
"""
定义Python的类,如下面的代码的实例。
自定义的 Model 都必须继承自 django.db.models.Model
"""class Question(models.Model):question_text = models.CharField(max_length=30)pub_date = models.DateTimeField("date published")class Choice(models.Model):question =  models.ForeignKey(Question, on_delete=models.CASCADE)choice_text = models.CharField(max_length=200)votes = models.IntegerField(default=0)

模型继承类型的介绍

Django Model 的继承与 Python 类的继承是一样的,只是 Django 要求所有自定义的 Model 都必须继承自 django.db.models.Model。在 Django 中 Model 之间有三种继承模型,它们分别是抽象基类、多表继承以及代理模型。

1. 抽象基类

抽象类继承的作用是将子表中通用的字段聚合在一起,并将这些字段统一定义在抽象基类中,避免于重复定义这些字段。抽象基类的定义通过在模型的 Meta 中定义属性 abstract=True 来实现。示例如下:

from django.db import modelsclass AbstractBase(models.Model):id = models.AutoField()content = models.CharField(max_length=100)username = models.CharField(max_length=80)nowday = models.DateTimeField()class Meta:abstract = Trueclass SomeThing(AbstractBase):testexams = models.CharField(max_length=50)class SomeComment(AbstractBase):level = models.CharField(max_length=20)

2. 多表继承

这是 Django 支持的第二种继承方式,因为每个类都是一个完整的 model,而不属于抽象基类,所以父 model 和子 Model 都会有数据库表,而且 Django 默认会给和子表和父表之间自动创建一个 OneToOneField 数据表关系,并且该字段将作为子表的主键。示例如下:

from django.db import models
class a(A):
testname=models.charFiled(max_length=255,help_text="测试")

3. 代理模型

代理模型用来给父 Model 添加一些方法或者修改其 Meta 选项,但是父 Model 的字段定义不会被修改。我们可以理解为对原父 Model 进行了 Copy,而被 Copy 出来的 Model 就叫做父 Model 的代理模型,但是这个代理模型又有其自己的特点,这相当于 Python 面向对象中的类继承与多态。

class BookExtend(Book):"""BOOK代理模型"""class Meta:ordering=['id'] #定义Meta选项顺序排序按照id字段proxy=True #设置代理模型def __str__(self):return "title:%s pub:%s price:%s" % (self.title, self.pub, self.price) #定义方法

激活你的模型

将APP添加到Django的相关设置中

上面的一小段用于创建模型的代码给了 Django 很多信息,通过这些信息,Django 可以:

  • 为这个应用创建数据库 schema(生成 CREATE TABLE 语句)。
  • 创建可以与 Question 和 Choice 对象进行交互的 Python 数据库 API。
    但是首先得把 polls 应用安装到我们的项目里。

现在,我们要回到settings.py中,修改我们的代码:

INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','polls.apps.PollsConfig',
]

在这里插入图片描述

数据库的迁移操作

现在你的 Django 项目会包含 polls 应用。接着在终端运行下面的命令:

py manage.py makemigrations polls

在这里插入图片描述

这条命令并不会直接执行数据库迁移的操作,而是会检测你对模型文件的修改,并且把修改的部分储存为一次 迁移。
现在,让我们看看迁移命令会执行哪些 SQL 语句。sqlmigrate 命令接收一个迁移的名称,然后返回对应的 SQL:

py manage.py sqlmigrate polls 0001

你将会看到下图的输出:
在这里插入图片描述

在官方文档里,重组为我们能看懂的格式,如下:

BEGIN;
--
-- Create model Question
--
CREATE TABLE "polls_question" ("id" bigint NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,"question_text" varchar(200) NOT NULL,"pub_date" timestamp with time zone NOT NULL
);
--
-- Create model Choice
--
CREATE TABLE "polls_choice" ("id" bigint NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,"choice_text" varchar(200) NOT NULL,"votes" integer NOT NULL,"question_id" bigint NOT NULL
);
ALTER TABLE "polls_choice"ADD CONSTRAINT "polls_choice_question_id_c5b4b260_fk_polls_question_id"FOREIGN KEY ("question_id")REFERENCES "polls_question" ("id")DEFERRABLE INITIALLY DEFERRED;
CREATE INDEX "polls_choice_question_id_c5b4b260" ON "polls_choice" ("question_id");COMMIT;

现在,再次运行 migrate 命令,在数据库里创建新定义的模型的数据表:

py manage.py migrate

在这里插入图片描述
此时,数据库中多了两张表,如下图:
在这里插入图片描述

小结

现在,你只需要记住,改变模型需要这三步:
1、编辑 models.py 文件,改变模型。
2、运行 python manage.py makemigrations 为模型的改变生成迁移文件。
3、运行 python manage.py migrate 来应用数据库迁移。

学习至此,你可以去休息一下,或者消化或者练习一下以上的知识,更快地掌握,不至于很快地忘记你学的知识。掌握并熟练运用一种知识,终究是要勤加练习的,不能偷懒。

分界线以下的知识,本是下一篇文章的内容,为了知识的连贯性,我将它们放在了一起,大家可以自由选择是否学习或者将这里做一个分界线。

人之为学,不日进则日退。——顾炎武

-------------------------------------------------分界线---------------------------------------------

初步认识和使用API

首先,通过以下命令进入交互行:

py manage.py shell

执行这个命令的目的,并不是单单地想要使用python,而是我们需要根据settings.py设置 Python 包的导入路径。并且,进入到这个界面,就可以探索在命令行探索数据库,即使你不懂数据库相关的知识。怎么样,是不是很贴心。

#请在shell交互行尝试以下的命令探索
from polls.models import Choice, Question
#查询表中所有的对象
Question.objects.all()
#输出:<QuerySet []>
from django.utils import timezone
#使用命令向模型传递参数
q = Question(question_text="What's new?", pub_date=timezone.now())
#执行保存命令后,Django会执行SQL的插入语句
q.save()
#查看id
q.id
#输出:1
#查看文本
q.question_text
#输出:"What's new?"
#查看日期
q.pub_date
#输出:datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=datetime.timezone.utc)
#改变文本内容
q.question_text = "What's up?"
#执行保存后,Django会执行修改操作
q.save()
#查看输出
Question.objects.all()
#输出:<QuerySet [<Question: Question object (1)>]>

讲到这里,大家有没有发现一个问题,貌似<QuerySet [<Question: Question object (1)>]>,这个东西对于我们来讲,并没有什么实质性的帮助。它只能让我们知道里面有东西,但具体是什么却不知道,当然,你完全可以去SQL命令行或者可视化软件里面查看,但是我们今天讨论的是Django的命令行。所以,现在我们要做的事情就是,修复这个问题。
在这里插入图片描述

现在让我们会到models这个文件,给 Question 和 Choice 增加 str() 方法。

from django.db import modelsclass Question(models.Model):# ...def __str__(self):return self.question_textclass Choice(models.Model):# ...def __str__(self):return self.choice_text

给模型增加 str() 方法是很重要的,这不仅仅能给你在命令行里使用带来方便,Django 自动生成的 admin 里也使用这个方法来表示对象。

让我们再为此模型添加一个自定义方法,修改models中的代码片段

import datetimefrom django.db import models
from django.utils import timezoneclass Question(models.Model):# ...def was_published_recently(self):return self.pub_date >= timezone.now() - datetime.timedelta(days=1)

保存这些更改并再次运行 python manage.py shell 以启动新的 Python 交互式 shell:

重新运行shell命令行

添加str方法后的变化

from polls.models import Choice, Question
Question.objects.all()
#输出:<QuerySet [<Question: What's up?>]>

在这里插入图片描述

使用ID查询

Question.objects.filter(id=1)
#<QuerySet [<Question: What's up?>]>

在这里插入图片描述

使用关键字进行模糊查询

Question.objects.filter(question_text__startswith="What")
#<QuerySet [<Question: What's up?>]>

在这里插入图片描述

通过时间查询对应的对象信息

from django.utils import timezone
current_year = timezone.now().year
Question.objects.get(pub_date__year=current_year)
#<QuerySet [<Question: What's up?>]>

在这里插入图片描述

异常处理

我在操作这部分内容的时候,出现了下面两种错误
1、NameError: name ‘Question’ is not defined
解决方案:导入from polls.models import Choice, Question,导入对应的参数
2、Django (2006, ‘MySQL server has gone away’)
解决方案:重新启动服务器,一般都能解决。
3、执行【Question.objects.get(id=2)】
解决方案:id不存在,创建该字段或者忽略该问题。

通过主键查询

Question.objects.get(pk=1)
#<Question: What's up?>

在这里插入图片描述

确保自定义的方法是有效的

q = Question.objects.get(pk=1)
q.was_published_recently()
#输出:True

在这里插入图片描述

处理models中的其它类

选项的查询以及创建

现在我们要开始处理我们编写的模型中的第二个Python类:选项。

#给这个问题几个选项,对象,执行INSERT语句,将选择项添加到集合中
#查询id=1的问题,并存储在变量q中
q = Question.objects.get(pk=1)
#显示相关对象集中的任何选项——到目前为止还没有。
q.choice_set.all()
#输出:<QuerySet []>
#创建3个选项
q.choice_set.create(choice_text="Not much", votes=0)
#<Choice: Not much>
q.choice_set.create(choice_text="The sky", votes=0)
#<Choice: The sky>
c = q.choice_set.create(choice_text="Just hacking again", votes=0)
#选择对象可以通过API访问其相关的问题对象。
#确认一下选项对应的问题
c.question
#<Question: What's up?>
q.choice_set.all()
#<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>
q.choice_set.count()
#输出:3
#查询
Choice.objects.filter(question__pub_date__year=current_year)
#<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>

删除选项的操作

#查询出来需要删除的选项,并存储在变量中
c = q.choice_set.filter(choice_text__startswith="Just hacking")
#执行删除操作
c.delete()

小结

写到这里,有关Django提供的API操作就暂时讨论到这里啦。是不是很便捷,这就是Django的强大指出之一。下面让我们一起走进Django的后台管理系统,为我们更加便捷的开发工作提供便利。

Django 管理页面

概述

为你的员工或客户生成一个用户添加,修改和删除内容的后台是一项缺乏创造性和乏味的工作。因此,Django 全自动地根据模型创建后台界面。
Django 产生于一个公众页面和内容发布者页面完全分离的新闻类站点的开发过程中。站点管理人员使用管理系统来添加新闻、事件和体育时讯等,这些添加的内容被显示在公众页面上。Django 通过为站点管理人员创建统一的内容编辑界面解决了这个问题。
管理界面不是为了网站的访问者,而是为管理者准备的。

管理页面的配置

创建超级管理员登录账号

要创建登录账号,请执行以下命令:

py manage.py createsuperuser

接着,根据提示创建用户名、电子邮件、密码、确认密码,如下图
在这里插入图片描述
由于我们创建的是超级管理员,所以所有的警示信息都可以忽略,直接选择y(是),直接执行即可。电子邮件如果不输入直接回车跳过即可。

管理页面

启动开发服务器

Django 的管理界面默认就是启用的。让我们启动开发服务器,看看它到底是什么样的。如果开发服务器未启动,用以下命令启动它:

py manage.py runserver

访问管理页面并登录

1、请访问你的后台管理地址,例如:http://127.0.0.1:8888/admin/。

在这里插入图片描述
2、输入用户名和密码进入后台管理界面,例如admin/123456
在这里插入图片描述

向管理页面中加入投票应用

但是我们的投票应用在哪呢?它没在索引页面里显示。只需要再做一件事:我们得告诉管理,问题 Question 对象需要一个后台接口。打开 polls/admin.py 文件,把它编辑成下面这样:

from django.contrib import admin
from .models import Question
admin.site.register(Question)

体验便捷的管理功能

现在我们向管理页面注册了问题 Question 类。Django 知道它应该被显示在索引页里:
在这里插入图片描述
点击 “Questions” 。现在看到是问题 “Questions” 对象的列表 “change list” 。这个界面会显示所有数据库里的问题 Question 对象,你可以选择一个来修改。这里现在有我们在上一部分中创建的 “What’s up?” 问题。

在这里插入图片描述
点击 “What’s up?” 来编辑这个问题(Question)对象:
在这里插入图片描述

变更历史

点击右上角的历史,之后页面如下图所示:
在这里插入图片描述
你会看到一个列出了所有通过 Django 管理页面对当前对象进行的改变的页面,其中列出了时间戳和进行修改操作的用户名:
在这里插入图片描述

总结

本文将两个课时的内容合为一篇长文章,详尽地讨论了API、模型以及后台管理系统。希望大家可以慢慢消化,认真阅读,有所收获。

下一篇文章,我们将继续深入Django,除了模型,下一篇文章我们将详尽地讲述Django的视图,请大家继续期待。

这一篇文章至此,已经写到末尾,感谢你的阅读和支持,如果允许,请点个赞或使用打赏功能进行鼓励。你的打赏将是我持续更新的动力。
下一篇文章,再见!

人生就象弈棋, 一步失误, 全盘皆输,这是令人悲哀之事;而且人生还不如弈棋,不可能再来一局,也不能悔棋。—— 弗洛伊德

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

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

相关文章

Repo命令使用实例(三十八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

Git快速掌握,通俗易懂

Git分布式版本控制工具 介绍 Git是一个开源的分布式版本控制系统&#xff0c;用于敏捷高效地处理任何或小或大的项目。Git是由Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。Git可以帮助开发者们管理代码的版本&#xff0c;避免代码冲突&#…

无人机地面站技术,无人机地面站理论基础详解

地面站作为整个无人机系统的作战指挥中心&#xff0c;其控制内容包括:飞行器的飞行过程&#xff0c;飞行航迹&#xff0c; 有效载荷的任务功能&#xff0c;通讯链路的正常工作&#xff0c;以及 飞行器的发射和回收。 无人机地面站总述 地面站作为整个无人机系统的作战指挥中心…

分层图最短路

分层最短路用更加具体或者形象一点的说法就是有限制的最短路径问题。 通常是拆点解决问题,原图中的点加上一个当前点的状态&#xff0c;成为一个新的点 P4568 [JLOI2011] 飞行路线 P4568 [JLOI2011] 飞行路线 #include <bits/stdc.h> #define int long long #define …

2024.2.14

1.请编程实现二维数组的杨慧三角 #include<stdio.h> #include<string.h> int main(int argc, const char *argv[]) { int n,i,j;printf("please enter n:");scanf("%d",&n);int arr[n][n];for(i0;i<n;i){for(j0;j<i;j){if(j0 || ij…

C++类和对象-多态->多态的基本语法、多态的原理剖析、纯虚函数和抽象类、虚析构和纯虚析构

#include<iostream> using namespace std; //多态 //动物类 class Animal { public: //Speak函数就是虚函数 //函数前面加上virtual关键字&#xff0c;变成虚函数&#xff0c;那么编译器在编译的时候就不能确定函数调用了。 virtual void speak() { …

C++文件操作->文本文件(->写文件、读文件)、二进制文件(->写文件、读文件)

#include<iostream> using namespace std; #include <fstream>//头文件包含 //文本文件 写文件 void test01() { //1.包含头文件 fstream //2.创建流对象 ofstream ofs; //3.指定打开方式 ofs.open("test.txt", ios::out); //4.写…

将人工智能应用于 DNS 流量以阻止恶意软件感染

Infoblox Inc. 透露&#xff0c;它正在利用人工智能 (AI) 来识别恶意软件来源的网站。然后可以阻止这些网站以使 IT 环境更加安全。 Infoblox 产品管理副总裁 Craig Sanderson 桑德森表示&#xff0c;SOC Insights 将机器学习算法应用于 BloxOne 威胁防御平台域名服务器 (DNS)…

[职场] 生育津贴如何申领与计算 #经验分享#微信#职场发展

生育津贴如何申领与计算 生育津贴如何申领? 生育津贴即为产假工资&#xff0c;相当于女职工在享受符合生育政策休假期间的工资。生育津贴高于本人产假工资标准的&#xff0c;用人单位不得克扣生育津贴低于本人产假工资标准的&#xff0c;差额部分由用人单位补足。 一、大部…

ArcgisForJS基础

文章目录 0.引言1.第一个ArcgisForJS应用程序1.1.安装部署ArcgisForJS1.2.实现ArcgisForJS应用程序 2.开发与调试工具2.1.集成开发环境2.2.调试工具2.3.Firebug 0.引言 ArcGIS API for JavaScript是一款由Esri公司开发的用于创建WebGIS应用的JavaScript库。它允许开发者通过调…

Vi 和 Vim 编辑器

Vi 和 Vim 编辑器 vi 和 vim 的基本介绍 Linux 系统会内置 vi 文本编辑器 Vim 具有程序编辑的能力&#xff0c;可以看做是 Vi 的增强版本&#xff0c;可以主动的以字体颜色辨别语法的正确性&#xff0c;方便程序设计。 代码补完、编译及错误跳转等方便编程的功能特别丰富&…

探索设计模式的魅力:创建型设计模式的比较与决策

设计模式专栏&#xff1a;http://t.csdnimg.cn/U54zu 目录 一、设计模式概览 1.1 创建型模式 二、比较创建型设计模式 1.1 适用场景典型用例 1.2 关键要素与差异对比 1.3 结构图 三、模式选择指南 3.1 场景分析 3.2 决策流程图 四、结语 4.1 优势 4.2 考量因素 一、…