免费个人域名邮箱,杭州seo运营,苏州住建局官网平台,市场营销是做什么的把时间用在思考上是最能节省时间的事情。——[美]卡曾斯
导言
写在前面
本文部分内容引用的是Django官方文档#xff0c;对官方文档进行了解读和理解#xff0c;对官方文档的部分注释内容进行了翻译#xff0c;以方便大家的阅读和理解。
概述
在上一篇文章里#xff0…把时间用在思考上是最能节省时间的事情。——[美]卡曾斯
导言
写在前面
本文部分内容引用的是Django官方文档对官方文档进行了解读和理解对官方文档的部分注释内容进行了翻译以方便大家的阅读和理解。
概述
在上一篇文章里我们学习了Django的数据库以及拓展数据库的使用以及设置项。这篇文章我们开始学习Django的模型、API以及后台管理系统的知识。 在 Django 里写一个数据库驱动的 Web 应用的第一步是定义模型 - 也就是数据库结构设计和附加的其它元数据。关于API,进入交互式 Python 命令行尝试一下 Django 为你创建的各种 API。 为你的员工或客户生成一个用户添加修改和删除内容的后台是一项缺乏创造性和乏味的工作。因此Django 全自动地根据模型创建后台界面。 Django 产生于一个公众页面和内容发布者页面完全分离的新闻类站点的开发过程中。站点管理人员使用管理系统来添加新闻、事件和体育时讯等这些添加的内容被显示在公众页面上。Django 通过为站点管理人员创建统一的内容编辑界面解决了这个问题。管理界面不是为了网站的访问者而是为管理者准备的。 学习目标
认识和学习模型并初步掌握脚本的编写方法学习模型的激活方法以及运行数据迁移命令了解并了解Django的API了解常用的相关命令初步认识后台管理系统创建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_length30)pub_date models.DateTimeField(date published)class Choice(models.Model):question models.ForeignKey(Question, on_deletemodels.CASCADE)choice_text models.CharField(max_length200)votes models.IntegerField(default0)模型继承类型的介绍
Django Model 的继承与 Python 类的继承是一样的只是 Django 要求所有自定义的 Model 都必须继承自 django.db.models.Model。在 Django 中 Model 之间有三种继承模型它们分别是抽象基类、多表继承以及代理模型。
1. 抽象基类
抽象类继承的作用是将子表中通用的字段聚合在一起并将这些字段统一定义在抽象基类中避免于重复定义这些字段。抽象基类的定义通过在模型的 Meta 中定义属性 abstractTrue 来实现。示例如下
from django.db import modelsclass AbstractBase(models.Model):id models.AutoField()content models.CharField(max_length100)username models.CharField(max_length80)nowday models.DateTimeField()class Meta:abstract Trueclass SomeThing(AbstractBase):testexams models.CharField(max_length50)class SomeComment(AbstractBase):level models.CharField(max_length20)2. 多表继承
这是 Django 支持的第二种继承方式因为每个类都是一个完整的 model而不属于抽象基类所以父 model 和子 Model 都会有数据库表而且 Django 默认会给和子表和父表之间自动创建一个 OneToOneField 数据表关系并且该字段将作为子表的主键。示例如下
from django.db import models
class a(A):
testnamemodels.charFiled(max_length255,help_text测试)3. 代理模型
代理模型用来给父 Model 添加一些方法或者修改其 Meta 选项但是父 Model 的字段定义不会被修改。我们可以理解为对原父 Model 进行了 Copy而被 Copy 出来的 Model 就叫做父 Model 的代理模型但是这个代理模型又有其自己的特点这相当于 Python 面向对象中的类继承与多态。
class BookExtend(Book):BOOK代理模型class Meta:ordering[id] #定义Meta选项顺序排序按照id字段proxyTrue #设置代理模型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_choiceADD CONSTRAINT polls_choice_question_id_c5b4b260_fk_polls_question_idFOREIGN 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_textWhats new?, pub_datetimezone.now())
#执行保存命令后Django会执行SQL的插入语句
q.save()
#查看id
q.id
#输出1
#查看文本
q.question_text
#输出Whats new?
#查看日期
q.pub_date
#输出datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfodatetime.timezone.utc)
#改变文本内容
q.question_text Whats 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(days1)保存这些更改并再次运行 python manage.py shell 以启动新的 Python 交互式 shell
重新运行shell命令行
添加str方法后的变化
from polls.models import Choice, Question
Question.objects.all()
#输出QuerySet [Question: Whats up?]使用ID查询
Question.objects.filter(id1)
#QuerySet [Question: Whats up?]使用关键字进行模糊查询
Question.objects.filter(question_text__startswithWhat)
#QuerySet [Question: Whats up?]通过时间查询对应的对象信息
from django.utils import timezone
current_year timezone.now().year
Question.objects.get(pub_date__yearcurrent_year)
#QuerySet [Question: Whats 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(id2)】 解决方案id不存在创建该字段或者忽略该问题。
通过主键查询
Question.objects.get(pk1)
#Question: Whats up?确保自定义的方法是有效的
q Question.objects.get(pk1)
q.was_published_recently()
#输出True处理models中的其它类
选项的查询以及创建
现在我们要开始处理我们编写的模型中的第二个Python类选项。
#给这个问题几个选项对象执行INSERT语句将选择项添加到集合中
#查询id1的问题并存储在变量q中
q Question.objects.get(pk1)
#显示相关对象集中的任何选项——到目前为止还没有。
q.choice_set.all()
#输出QuerySet []
#创建3个选项
q.choice_set.create(choice_textNot much, votes0)
#Choice: Not much
q.choice_set.create(choice_textThe sky, votes0)
#Choice: The sky
c q.choice_set.create(choice_textJust hacking again, votes0)
#选择对象可以通过API访问其相关的问题对象。
#确认一下选项对应的问题
c.question
#Question: Whats 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__yearcurrent_year)
#QuerySet [Choice: Not much, Choice: The sky, Choice: Just hacking again]删除选项的操作
#查询出来需要删除的选项并存储在变量中
c q.choice_set.filter(choice_text__startswithJust 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的视图请大家继续期待。
这一篇文章至此已经写到末尾感谢你的阅读和支持如果允许请点个赞或使用打赏功能进行鼓励。你的打赏将是我持续更新的动力。 下一篇文章再见
人生就象弈棋 一步失误 全盘皆输这是令人悲哀之事而且人生还不如弈棋不可能再来一局也不能悔棋。—— 弗洛伊德