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

news2024/11/28 18:38:41

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

导言

写在前面

本文部分内容引用的是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 models

class AbstractBase(models.Model):
    id = models.AutoField()
    content = models.CharField(max_length=100)
    username = models.CharField(max_length=80)
    nowday = models.DateTimeField()
    class Meta:
        abstract = True

class 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 models


class Question(models.Model):
    # ...
    def __str__(self):
        return self.question_text


class Choice(models.Model):
    # ...
    def __str__(self):
        return self.choice_text

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

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

import datetime

from django.db import models
from django.utils import timezone


class 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.coloradmin.cn/o/1450412.html

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

相关文章

C#,生成字符串整数校验码(Checksum)的谷歌(Google)算法与源代码

如题。 校验码系统是产生校验码并校验包括校验码在内的字符串的一套规则。 它可以防止在抄录和键入字符串时产生的错误。 一般生成 MD5 校验&#xff0c;也可以生成、进行简单、快速的 整数 校验。 谷歌开源&#xff0c;很实用的整数校验码生成代码。 1 文本格式 using Sy…

Python免费下载安装全流程(Python 最新版本),新手小白必看!

前言 今天换了新的电脑&#xff0c;需要重新安装python和PyCharm&#xff0c;就简单的写个教程吧~ 一、Python下载 1、进入Python官网 官网地址&#xff1a;https://www.python.org 2、点击【Downloads】展开后点击【Windows】跳转到下载python版本页面&#xff0c;选择&qu…

物联网技术的崛起:驱动智慧景区的新篇章

随着科技的飞速发展&#xff0c;物联网技术逐渐成为推动各行各业创新的重要力量。在旅游业中&#xff0c;物联网的应用为智慧景区的建设提供了有力支持&#xff0c;为游客带来了更加便捷、智能的旅游体验。本文将探讨物联网技术在智慧景区中的应用及其对旅游业的影响&#xff0…

[职场] 求职如何设置预期 #笔记#经验分享

求职如何设置预期 在求职的道路上&#xff0c;无论处于哪个年龄阶段&#xff0c;合理的就业期望值才能使我们的愿望与社会的需求相吻合&#xff0c;才能让自己在今后的工作中发挥出最大的实力与能力。 一、结合测评软件&#xff0c;明确求职目标 根据霍兰德职业兴趣测试结果&a…

解密ERP业务架构:打造高效运营与持续增长的关键

在当今竞争激烈的商业环境中&#xff0c;企业需要有效管理和整合各个部门的业务流程和信息&#xff0c;以实现高效运营和持续增长。而ERP&#xff08;企业资源规划&#xff09;系统作为一种集成的业务管理平台&#xff0c;扮演着至关重要的角色。本文将探讨ERP业务架构的重要性…

[经验] 欧阳修唐宋八大家之首是谁 #微信#知识分享#学习方法

欧阳修唐宋八大家之首是谁 1、唐宋八大家之首是谁 唐宋八大家是中国文学史上最具代表性的八位大文豪&#xff0c;他们的文学成就在中国文学史上占有重要地位&#xff0c;被誉为文学史上的“巨人”。 唐宋八大家之首&#xff0c;无疑是唐代著名诗人杜甫。他出生在一个贫苦的家…

RK3568笔记十五:触摸屏测试

若该文为原创文章&#xff0c;转载请注明原文出处。 使用正点原子的ATK-RK3568板子&#xff0c;一直在测试屏幕和视频&#xff0c;突然想到触摸屏测试&#xff0c;一直没有用过&#xff0c;原子给的demo跑的是QT系统&#xff0c;触摸功能是正常的&#xff0c;测试一下&#xf…

C语言strlen和sizeof的区别

strlen和sizeof没有联系 前者是库函数&#xff0c;统计长度的标志是是否有\0 后者是操作符。计算长度的标志是字节数量。

电脑监控屏幕软件有哪些(监控电脑屏幕的软件)

随着信息技术的迅猛发展&#xff0c;电脑屏幕监控软件已成为企业、家庭以及教育机构保护数据安全、提升工作效率以及进行行为分析的重要工具。本文将详细介绍几款主流的电脑屏幕监控软件&#xff0c;包括它们的功能、特点以及适用场景&#xff0c;帮助读者更好地了解并选择合适…

31.File文件

File文件 1. 概述2. 构造方法2.1 方法2.2 代码示例 3. 成员方法3.1 判断、获取的方法3.1.1 方法3.1.2 代码示例 3.2 创建、删除的方法3.2.1 方法3.2.2 代码示例 3.3 获取、遍历的方法3.3.1 重点方法3.3.1.1 方法3.3.1.2 代码示例 3.3.2 所有方法3.3.2.1 方法3.3.2.2 代码示例 4…

【数据结构】LRU Cache

文章目录 LRUCache LRUCache 1. LRUCache是一种缓存的替换技术&#xff0c;在CPU和main memory之间根据计算机的局部性原理&#xff0c;往往会采用SRAM技术来构建CPU和主存之间的高速缓存&#xff0c;DRAM(dynamic random access memory)用于构建主存&#xff0c;LRUCache这种…

Rust 数据结构与算法:3栈:用栈实现符号匹配

1、符号匹配 如&#xff1a; (56)(78)/(43)、{ { ( [ ] [ ])}}、(ab)(c*d)func() 等各类语句的符号匹配。 这里我们关注的不是数字而是括号&#xff0c;因为括号更改了操作优先级&#xff0c;限定了语言的语义&#xff0c;这是非常重要的。如果括号不完整&#xff0c;那么整个…

Ps:焦点堆栈

焦点堆栈 Focus Stacking是一种摄影和图像处理技术&#xff0c;通过合并多张在不同焦距拍摄的照片来创建一张具有更大景深的图像&#xff0c;特别适用于微距摄影、风景摄影和任何需要在整个场景中保持尖锐对焦的情况。 ◆ ◆ ◆ 拍摄注意事项 1、使用三脚架 为了确保图像之间…

STM32——OLED菜单(二级菜单)

文章目录 一.补充二. 二级菜单代码 简介&#xff1a;首先在我的51 I2C里面有OLED详细讲解&#xff0c;本期代码从51OLED基础上移植过来的&#xff0c;可以先看完那篇文章&#xff0c;在看这个&#xff0c;然后按键我是用的定时器扫描不会堵塞程序,可以翻开我的文章有单独的定时…

医院三基怎么搜题答案? #学习方法#学习方法#微信

在大学生的学习过程中&#xff0c;遇到难题和疑惑是常有的事情。然而&#xff0c;随着互联网的普及和技术的发展&#xff0c;搜题和学习软件成为了大学生们解决问题的利器。今天&#xff0c;我将向大家推荐几款备受大学生喜爱的搜题和学习软件&#xff0c;帮助我们更好地应对学…

VMware虚拟机网络配置

VMware虚拟机网络配置 桥接模式NAT网络 桥接模式 桥接模式其实就是借助你宿主机上的网卡进行联网和通信&#xff0c;所以相当于虚拟机和宿主机平级&#xff0c;处于同一个网段中。 配置要点&#xff1a; 注意选择正确的宿主机网卡 查看宿主机的网络信息&#xff0c;这些信息指…

VMwareWorkstation17.0虚拟机安装Windows2.03

VMwareWorkstation17.0虚拟机安装Windows2.03 第一篇 下载Windows2.03第二篇 配置Windows2.03虚拟机机器环境第三篇 启动Windows2.03系统 第一篇 下载Windows2.03 1.Windows2.0原版软盘下载地址是 暂不提供&#xff0c;后续更新 2.Windows2.03虚拟机镜像下载地址是 Windows2…

ChatGPT高效提问—prompt实践(白领助手)

ChatGPT高效提问—prompt实践&#xff08;白领助手&#xff09; ​ 随着社会的不断发展&#xff0c;白领的比例越来越高。白领的工作通常较为繁忙&#xff0c;需要管理复杂的项目。工作量大、要求高、任务紧急&#xff0c;时间分配不当部分可能导致工作效率低下&#xff0c;任…

云备份项目:在云端保护您的数据【二、开发】

☘️过度的信息对一个过着充实生活的人来说&#xff0c;是一种不必要的负担☘️ 文章目录 前言工具类实现文件实用工具类代码实现 Json实用工具类代码实现 服务端单例配置类系统配置信息单例配置类 数据管理类数据信息数据管理 热点管理类业务处理类 客户端数据管理类文件备份类…

基于微信小程序的智能社区服务小程序,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…