django的模型就是用于在数据库中存储的某种类型的对象。在我们的博客系统中, 发表的文章就是一个模型,需要存储在数据库中。 这里我们使用django默认的sqlite3库,对于我们的这个小系统而言已经足够了。

创建一个应用

在django中有两个概念需要弄清楚。一个是工程(project)的概念,一个是应用(application)的概念。 它们的关系是:一个工程中包含多个应用。每个应用都是独立的,应用通过setting.py注册到工程中来就可以使用了。 这样可以解耦合,并且好的应用也可以复用。很好的模块化设计!

在manage.py文件所在目录,执行下面命令:

(myvenv) [mango@centos00 mysite]$ python manage.py startapp blog

你会看到一个新的blog文件夹被创建,并且下面多了许多文件,目前结构如下:

mysite
├── mysite
| __init__.py
| settings.py
| urls.py
| wsgi.py
├── manage.py
└── blog
├── migrations
| __init__.py
├── __init__.py
├── admin.py
├── models.py
├── tests.py
└── views.py

然后在setting.py中注册这个应用

1
2
3
4
5
6
7
8
9
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog',
)

创建一个博客文章的模型

在blog/models.py中定义所有的模型,用vim打开后添加下面的内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User class Post(models.Model):
author = models.ForeignKey(User)
title = models.CharField(max_length=200)
text = models.TextField()
created_date = models.DateTimeField(default=timezone.now)
published_date = models.DateTimeField(blank=True, null=True) def publish(self):
self.published_date = timezone.now()
self.save() def __str__(self):
return self.title

我们定义了作者,标题,文章内容,创建时间,发布时间等。还添加了一个publish方法用于保存发布。 每个字段都需要定义它的类型,这里的几个类型解释如下:

CharField:普通的文本
TextField:长文本
DateTimeField:日期时间类型
ForeignKey:外键类型

详细的字段类型说明请参考官方文档:field-types

在数据库中为模型生成表结构:

每次我们新建了一个模型后,需要在数据库中添加对应的表。

第一步是先让django感知到我们刚刚已经创建了一个新的模型:

(myvenv) [mango@centos00 mysite]$ python manage.py makemigrations blog

输出如下:

Migrations for 'blog':
0001_initial.py:
- Create model Post

这时候django已经为我们准备好了数据库更新的sql文件。

第二步是让django帮我们执行这些文件:

(myvenv) [mango@centos00 mysite]$ python manage.py migrate blog

输出如下:

Operations to perform:
Apply all migrations: blog
Running migrations:
Applying blog.0001_initial... OK

OK,这时候数据库中已经有post这张表了。

对象关系映射ORM

下面我们看看django的ORM是怎样和数据库打交道的。

首先解释下QuerySet,它是某个模型的对象列表,用来从数据库中读取数据,过滤和排序等等。

Django控制台Django Shell

执行以下命令可以打开django的控制台

(myvenv) [mango@centos00 mysite]$ python manage.py shell

查询所有的博客文章

>>> from blog.models import Post
>>> Post.objects.all()
[]

这时候肯定是空的,因为我们还没有任何数据。

下面我们去新建几篇文章

先要创建一个用户,因为Post里面有User外键

>>> from django.contrib.auth.models import User
>>> User.objects.create(username='ola')
<User: ola>
>>> User.objects.all()
[<User: ola>]

然后添加文章:

>>> user = User.objects.get(username='ola')
>>> Post.objects.create(author = user, title = 'Sample title', text = 'Test')
<Post: Sample title>
>>> Post.objects.all()
[<Post: Sample title>]

文章过滤

先像前面那样再添加几篇文章,此处省略七十二个字….

>>> Post.objects.filter(author=user)
[<Post: Sample title>, <Post: Cool day Aha>, <Post: LiLei and Hanmeimei>, <Post: Happy boy>]
>>> Post.objects.filter(title__contains='LiLei')
[<Post: LiLei and Hanmeimei>]
>>> Post.objects.filter(published_date__isnull=False)
[]

最后的输出表示所有的文章published_date都是空的。我想改变这个情况。可以这样做

>>> post = Post.objects.get(id=1)
>>> post.publish()
>>> Post.objects.filter(published_date__isnull=False)
[<Post: Sample title>]

结果排序

还可以根据某个或某几个字段来排序检索结果

>>> Post.objects.order_by('created_date')
[<Post: Sample title>, <Post: Cool day Aha>, <Post: LiLei and Hanmeimei>, <Post: Happy boy>]
>>> Post.objects.order_by('-created_date')
[<Post: Happy boy>, <Post: LiLei and Hanmeimei>, <Post: Cool day Aha>, <Post: Sample title>]

OK,目前为止你应该对django的ORM有了大体的了解了。

请用exit()退出django的控制台

>>> exit()

利用django admin修改模型

在上面我们已经创建了Post模型并且通过django控制台来添加修改模型。 然后我们使用django自带的web管理界面admin来在页面上修改模型数据。

模型注册

首先我们需要在admin中注册对应的模型,打开blog/admin.py文件,修改如下

1
2
3
4
from django.contrib import admin
from .models import Post admin.site.register(Post)

注意上面的from .models import Post,使用到了python3的相对导入。

运行服务器

一切都这么简单,接下来我们启动服务器

(myvenv) [mango@centos mysite]$ python manage.py runserver 192.168.203.95:8000

打开链接:http://192.168.xxx.xxx:8000/admin/

看到下面的界面:

添加管理员

不过你需要一个管理员才能登录。运行python manage.py createsuperuser可以创建管理员账号。

(myvenv) [mango@centos00 mysite]$ python manage.py createsuperuser
Username (leave blank to use 'mango'): admin
Email address: admin@gmail.com
Password:
Password (again):
Superuser created successfully.

我创建了一个admin/admin的账户。这时候登录

点击Posts修改或者增加等等,确保里面至少2个又published_date,这个后面会用到。

更多关于django admin的内容,参考官方文档:admin

Django开发博客- 模型的更多相关文章

  1. django开发博客(1) 入门

    现在正式开始博客开发 1.安装django1.4 如果你使用的是fedoraDVD版,安装时选择了web开发组建,这一步可以省略,因为它自带django环境 django下载地址 https://ww ...

  2. 纯django开发博客系统

    企业级教程:纯django开发博客系统 1.视频教程 https://www.duanshuilu.com/ 2.教程文档 https://www.duanshuilu.com/ 0.课程简介1.简价 ...

  3. Django开发博客- 三部曲

    其实在django中实现一个功能只需要三个步骤即可,这里我姑且叫它三部曲. 这三部曲就是: 定义urls映射 定义views 定义templates 什么是URL? URL就算一个WEB地址,你在浏览 ...

  4. 使用django开发博客过程记录4——Category分类视图

    在写点击博客的所属分类,显示所有该分类的文章时真是让我想了好一会,为什么呢?因为我使用的是cbv模式开发的而不是简单的视图处理逻辑的,所以,有些操作会被包装好了,你并不知道它的细节,那么我们今天要实现 ...

  5. 使用django开发博客过程记录3——博客侧栏实现

    说起这个侧栏真是苦恼我很长时间,一开始以为和之前的一样传递额外参数就可以了就像下面这样: class IndexView(ListView): template_name = 'apps/index. ...

  6. Django开发博客 入门篇

    Django是神马? Django是一个开源免费的Web框架,使用Python编写.能够让你快速写出一个Web应用, 因为它包含了绝大部分的组件,比如认证,表单,ORM,Session,安全,文件上传 ...

  7. 使用django开发博客过程记录5——日期归档和视图重写

    针对每条博客的观看次数我么是使用django的Mixin实现的: def get(self, request, *args, **kwargs): last_visit = request.sessi ...

  8. 使用django开发博客过程记录2——博客首页及博客详情的实现

    1.什么是CBV(Class-based views) 2.博客首页及博客详情实现 1.什么是CBV 什么是CBV?说白了就是以前是视图为处理请求返回响应的函数,有了cbv之后我们就可以用类处理请求和 ...

  9. Django开发博客- 部署

    安装Git Git是一个被大量程序员使用的”版本控制系统”.此软件可以跟踪任何时间文件的改变,这样你以后可以随时召回某个特定版本. windows系统下面可以下载git-scm安装.除了第5步”Adj ...

随机推荐

  1. 定时自动启动任务crontab命令用法

    crontab简介 crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令.该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行.该词 ...

  2. Jenkins-CVE-2016-0792漏洞利用及修复建议

    漏洞概述: 国外网站 Contrast Security 于2016年2月24日在公开了Jenkins近日修复的一个可通过低权限用户调用 API 服务致使的命令执行漏洞详情.通过低权限用户构造一个恶意 ...

  3. Node.js 事件循环(Event Loop)介绍

    Node.js 事件循环(Event Loop)介绍 JavaScript是一种单线程运行但又绝不会阻塞的语言,其实现非阻塞的关键是“事件循环”和“回调机制”.Node.js在JavaScript的基 ...

  4. windows c dll的创建与调用

    DLL代码: // TestDynamic.cpp: implementation of the TestDynamic class. // ///////////////////////////// ...

  5. UML分析与设计

    考点: 掌握面向对象的分析与设计 掌握UML描述方法 用例图.类图.序列图.状态转换图 类图:类的属性.方法的识别:类间的各种关系 类图:实体.联系 各种关系图例: 泛化:取公共属性 关联分为聚合.组 ...

  6. 基本的DMA控制器

    DMA的基本概念 直接内存访问(DMA)是一种完全由硬件执行I/O交换的工作方式.在这种方式中,DMA控制器从CPU完全接管对总线的控制,数据交换不经过CPU,而直接在内存和I/O设备之间进行 .DM ...

  7. sqlserver2008创建数据库 报 Cannot read property is filestream 此属性不可用于sql server 7.0 解决

    在创建数据库的时候,报整个错误 Cannot read property is filestream 此属性不可用于sql server 7.0 按照网上的方法  (http://blog.csdn. ...

  8. HDU 5929 Basic Data Structure 模拟

    Basic Data Structure Time Limit: 7000/3500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Oth ...

  9. Spring管理bean的生命周期

    1: bean的创建:   如果我们默认的scope配置为Singleton的话, bean的创建实在Spring容器创建的时候创建: 如果scope的配置为Prototype的话,bena的创建是在 ...

  10. read 判定用户输入的状态后运行相应的结果

    文件名: test26.sh #!/bin/bash # getting just one character of input read -n1 -p "Do you want to co ...