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. 用于JDBC操作数据库的公共类

    /* * @(#)CommonSql.java 2011-9-5 * * Copyright 2011 Bianjing,All rights reserved. */ import java.sql ...

  2. 【leetcode❤python】387. First Unique Character in a String

    #-*- coding: UTF-8 -*- class Solution(object):    def firstUniqChar(self, s):        s=s.lower()     ...

  3. 【Unity3D游戏开发】之Sprite Packer使用方法 (九)[转]

    前置说明: 我们用来做sprite 的图片,通常会留有很多空白的地方,我们在画完了sprite之后,这些地方很可能就没有什么作用了.如果想避免这些资源上的浪费,我们可以把各个sprite做成图集,把图 ...

  4. 终端、shell、bash的区别联系

    最佳答案 终端,即所谓的命令行界面,又称命令终端,用户输入shell命令用的窗口,跟Windows里的DOS界面差不多. shell,Shell就是用户和操作系统之间的壳,中介,GUI和CLI都算是S ...

  5. 移除virbr0

    在我们使用虚拟机管理器的图形界面来安装虚拟机的时候,自动创建虚拟网桥和虚拟网卡.另外,我们很少会在一个虚拟机中再安装一个虚拟机,所以,我们可以将宿主机上的网桥删除.方法如下: # virsh net- ...

  6. Limiting To Select Only 5 Check Boxes Out Of Ten In Oracle Forms

    Suppose you want to give an option to user to select only 5 check boxes from given any number of che ...

  7. Create Stacked Canvas to Scroll Horizontal Tabular Data Blocks In Oracle Forms

    In this tutorial you will learn to create horizontal scrollable tabular or detail data block by usin ...

  8. How to evaluate a transimpedance amplifier (part 2)

    In my previous blog on "How to evaluate a transimpedance amplifier, part 1", we looked at ...

  9. Oracle同义词学习

    oracle的同义词总结   从字面上理解就是别名的意思,和视图的功能类似.就是一种映射关系.   同义词拥有如下好处:   节省大量的数据库空间,对不同用户的操作同一张表没有多少差别;   扩展的数 ...

  10. hdu 2112 (最短路+map)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=2112 HDU Today Time Limit: 15000/5000 MS (Java/Others)  ...