django1.10開發(fā)博客(3)——應(yīng)用與模型

上一節(jié)我們建立了一個最基本的工程項(xiàng)目,這一節(jié)我們要在里面添加應(yīng)用,填充數(shù)據(jù)庫,并且能在后臺管理界面看到他。

創(chuàng)建應(yīng)用


在django中有兩個概念需要弄清楚。一個是工程(project)的概念,一個是應(yīng)用(application)的概念。它們的關(guān)系是:一個工程中包含多個應(yīng)用。每個應(yīng)用都是獨(dú)立的,應(yīng)用通過setting.py注冊到工程中來就可以使用了。而一個應(yīng)用也可以被不同工程復(fù)用,這大大提高了開發(fā)效率。

進(jìn)入虛擬環(huán)境就不多說了,還是在第一級mysite目錄內(nèi),執(zhí)行下面命令:

(myvenv) $ python manage.py startapp blog

這就建立了一個名為blog的應(yīng)用?,F(xiàn)在的目錄結(jié)構(gòu)如下:

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

打開settings.py,添加blog應(yīng)用:

# Application definition
    
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog',    #新增加的應(yīng)用
]

到此,一個應(yīng)用已經(jīng)建立并加入工程了。

創(chuàng)建模型


上一節(jié)中我們曾說django采用了MVC設(shè)計(jì)模式,這里的M就是模型models。我理解模型就是規(guī)定了網(wǎng)頁數(shù)據(jù)結(jié)構(gòu)的類型,比如對于一個博客來說,其基本組成就是一篇篇文章,而文章包含了標(biāo)題、作者、標(biāo)簽、正文、創(chuàng)建時間和發(fā)布時間等元素。據(jù)此我們在models.py中建立如下Article模型:

from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User

class Article(models.Model):
    author = models.ForeignKey(User)
    title = models.CharField(max_length=200)
    category = models.CharField(max_length=50, blank=True)
    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

我們引用了django.db內(nèi)的models,定義了我們的模型,并建立了publish方法來發(fā)布文章。````str或者unicode```告訴系統(tǒng)使用title字段來表示這個Article的對象。模型內(nèi)的幾種類型解釋如下:

  • CharField:普通的文本,用來存儲字符串,max_length設(shè)置最大長度
  • TextField:長文本,存儲大量文本
  • DateTimeField:日期時間類型,default=timezone.nowb表示默認(rèn)時間就是當(dāng)前系統(tǒng)時間
  • ForeignKey:外鍵類型

數(shù)據(jù)庫生成表


我們雖然在models內(nèi)建立了數(shù)據(jù)模型,但是數(shù)據(jù)庫并不知道我們的數(shù)據(jù)到底是怎么組成的,有什么特點(diǎn),因此還要同步數(shù)據(jù)庫,在數(shù)據(jù)庫內(nèi)生成表。每次我們建立一個新的模型,都要在數(shù)據(jù)庫內(nèi)添加對應(yīng)的表。

第一步是先讓django感知到我們剛剛已經(jīng)創(chuàng)建了一個新的模型:

(myvenv) $ python manage.py makemigrations blog

輸出如下:

Migrations for 'blog':
  blog\migrations\0001_initial.py:
    - Create model Article

第二步是讓django幫我們執(zhí)行這些文件:

(myvenv) $ python manage.py migrate blog

輸出如下:

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

數(shù)據(jù)庫內(nèi)就有Article這張表了。

對象關(guān)系映射ORM


對象關(guān)系映射ORM提供了概念性的、易于理解的模型化數(shù)據(jù)的方法。ORM方法論基于三個核心原則:

  • 簡單:以最基本的形式建模數(shù)據(jù)。
  • 傳達(dá)性:數(shù)據(jù)庫結(jié)構(gòu)被任何人都能理解的語言文檔化。
  • 精確性:基于數(shù)據(jù)模型創(chuàng)建正確標(biāo)準(zhǔn)化了的結(jié)構(gòu)。
    ORM一定程度上簡化了數(shù)據(jù)庫操作。想學(xué)習(xí)ORM框架的更多知識請自行Google。下面我們看看django的ORM是怎樣和數(shù)據(jù)庫打交道的。
進(jìn)入Django Shell

進(jìn)入django shell與進(jìn)入Python shell十分相似:

(myvenv) $ python manage.py shell
Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:01:18) [MSC v.1900 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>
添加用戶和文章

我們先查看現(xiàn)在數(shù)據(jù)庫內(nèi)的文章:

>>> from blog.models import Article
>>> Article.objects.all()
<QuerySet []>

這里的QuerySet是Article模型的對象列表,用來從數(shù)據(jù)庫中讀取數(shù)據(jù),過濾和排序等等,現(xiàn)在列表當(dāng)然為空。

模型Article里有author = models.ForeignKey(User),所以在添加文章前,我們先建立一個用戶User。

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

然后添加文章:

>>> user = User.objects.get(username='yuan')
>>> Article.objects.create(author = user, title = 'Sample title', category = 'test', text = 'Test')
<Article: Sample title>
>>> Article.objects.all()
<QuerySet [<Article: Sample title>]>

可見我們已經(jīng)添加了一篇作者是yuan,標(biāo)題為Sample title,標(biāo)簽是test,內(nèi)容是Test的博客。這里用標(biāo)題代表了一篇文章,這是不是和models里的__str__一致?用這種方法多添加幾篇文章。

文章的刪、改、查

我們剛才使用Article.objects.all()獲取全部文章,還可以用get獲取和filter過濾文章,可以在filter括號內(nèi)使用多個過濾條件,用逗號隔開:

>>> Article.objects.get(id = 1)
<Article: Sample title>
>>> Article.objects.filter(author=user)
<QuerySet [<Article: Sample title>, <Article: Sample title2>, <Article: Sample title3>]>
>>> Article.objects.filter(title__contains='2')
<QuerySet [<Article: Sample title2>]>
>>> Article.objects.filter(published_date__isnull=False)
<QuerySet []>

我們最后查到了一張空表,這是因?yàn)樗形恼露紱]有設(shè)定發(fā)布時間??梢岳肁rticle內(nèi)的方法publish設(shè)定它:

>>> fir = Article.objects.get(id=1)
>>> fir.publish()
>>> Article.objects.filter(published_date__isnull=False)
<QuerySet [<Article: Sample title>]>

對于其他內(nèi)容,也可以修改:

>>> sec = Article.objects.get(id=2)
>>> sec.text
'Test2'
>>> sec.text = 'this is the second text'
>>> sec.text
'this is the second text'

當(dāng)然,也可以刪除文章:

>>> thr = Article.objects.get(id=3)
>>> thr.delete()
(1, {'blog.Article': 1})
>>> Article.objects.all()
<QuerySet [<Article: Sample title>, <Article: Sample title2>]>
排序

可以按照某關(guān)鍵字排序,關(guān)鍵字前加“-”表示反序:

>>> Article.objects.order_by('created_date')
<QuerySet [<Article: Sample title>, <Article: Sample title2>]>
>>> Article.objects.order_by('-created_date')
<QuerySet [<Article: Sample title2>, <Article: Sample title>]>

最后exit()退出即可。

>>> exit()


admin后臺管理


除了在django控制臺對文章進(jìn)行操作,更多的是在admin后臺管理界面進(jìn)行管理。下一步就是實(shí)現(xiàn)這個功能。

查看mysite\mysite\settings.py:

# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',    # 默認(rèn)添加admin后臺管理功能
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog',
]

以及mysite\mysite\urls.py也默認(rèn)添加進(jìn)入后臺的url:

urlpatterns = [
    url(r'^admin/', admin.site.urls),
]

在mysite\blog\admin.py注冊對應(yīng)的模型:

from django.contrib import admin    
from .models import Article

admin.site.register(Article)

這里的.models使用了Python3的相對導(dǎo)入,指向和admin.py同一目錄下的models.py。

接下來只需要注冊一個管理員賬號:

(myvenv) $ python manage.py createsuperuser
Username (leave blank to use 'yukim'): admin
Email address: 
Password:
Password (again):
Superuser created successfully.

兩個password項(xiàng)的輸入會隱藏起來看不見,輸入密碼回車即可。賬號創(chuàng)建完畢!
啟動服務(wù)器:

(myvenv) $ python manage.py runserver

根據(jù)url設(shè)置,打開鏈接:http://127.0.0.1:8000/admin/
輸入賬號密碼:

2.jpg



進(jìn)入管理界面:
3.jpg



就可以在里面對文章直接進(jìn)行增刪改查:
5.jpg



多添加幾篇文章,并確保至少有兩篇有Publish date,防止后續(xù)出錯。
關(guān)于admin界面的更多使用,可以參照官方文檔:admin
也可以用bootstrap等第三方插件美化界面,這里就不詳細(xì)介紹了。

2016.10.20

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容