
數(shù)據(jù)庫(kù)遷移
寫完數(shù)據(jù)庫(kù)模型之后,要根據(jù)這個(gè)模型創(chuàng)建數(shù)據(jù)庫(kù)。目前Django支持如下數(shù)據(jù)庫(kù)引擎:
- MySQL:
django.db.backends.mysql - SQLite 3:
django.db.backends.sqlite3 - PostgreSQL:
django.db.backends.postgresql_psycopg2
其中SQLite3是Python自帶的,對(duì)于我們這種小博客是夠用了的。因此就不需要去setting.py里修改了。
Django使用manage.py的makemigrations刪除建立新的migrations檔案,記錄 數(shù)據(jù)變化。用migrate根據(jù)這份檔案進(jìn)行實(shí)際操作。
(env)$ python manage.py makemigrations
Migrations for 'appblog':
appblog/migrations/0001_initial.py:
- Create model Category
- Create model Post
- Create model Tag
- Add field tags to post
(env)$ python manage.py migrate
Operations to perform:
Apply all migrations: admin, appblog, auth, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying appblog.0001_initial... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying sessions.0001_initial... OK
數(shù)據(jù)庫(kù)的遷移記錄存放在migration的文件夾下。
數(shù)據(jù)庫(kù)的增取刪改(CRUD)
數(shù)據(jù)庫(kù)的主要操作就是增加數(shù)據(jù),提取數(shù)據(jù),刪除數(shù)據(jù),修改數(shù)據(jù)這四個(gè)內(nèi)容。我們沒有必要專門學(xué)習(xí)SQL的語法,Django提供了專門的Python函數(shù)用來完成任務(wù)。
學(xué)習(xí)Python函數(shù)管理模型雖然快捷,但是不夠可視化。我們可以到服務(wù)器后代,以管理員的形式進(jìn)行修改。
第一步:檢查INSTALL_APPS和URL里面是否有管理員選項(xiàng)
setting.py
INSTALLED_APPS = (
'django.contrib.admin',
...
)
urls.py
url(r'^admin/', include(admin.site.urls)),
第二步: 創(chuàng)建管理員
python manage.py createsuperuser
會(huì)要求輸入密碼和賬號(hào)
第三步: 設(shè)置需要管理的model
blog/admin.py
from django.contrib import admin
# Register your models here.
from .models import Post
from .models import Category
from .models import Tag
admin.site.register(Post)
admin.site.register(Category)
admin.site.register(Tag)
第四步:打開127.0.0.1:8000/admin管理
python manage.py runserver

基本上沒有特殊需求,我們就用這個(gè)后臺(tái)管理就行了。至于專門的函數(shù)我就不想去學(xué)了,太麻煩了。但是多多了解,敲敲代碼,有助于肌肉記憶。
進(jìn)入Django定制的shell
python manage.py shell
增(Create): 增加新的內(nèi)容到數(shù)據(jù)庫(kù)去
from blog.models import Category
Category.objects.create(name="Django")
# 或
c = Category(name="Flask")
c.save()
取(Read): 查看數(shù)據(jù)庫(kù)有什么內(nèi)容
Category.objects.all()
Out[9]: <QuerySet [<Category: Category object>, <Category: Category object>, <Category: Category object>]>
objects 是我們的模型管理器,它為我們提供一系列從數(shù)據(jù)庫(kù)中取數(shù)據(jù)方法,這里我們使用了 all 方法,表示我們要把對(duì)應(yīng)的數(shù)據(jù)全部取出來??梢钥吹?all方法都返回了數(shù)據(jù),這些數(shù)據(jù)應(yīng)該是我們之前存進(jìn)去的,但是顯示的字符串有點(diǎn)奇怪,無法看出究竟是不是我們之前存入的數(shù)據(jù)。為了讓顯示出來的數(shù)據(jù)更加人性化一點(diǎn),我們?yōu)?3 個(gè)模型分別增加一個(gè) __str__ 方法:
class Category(models.Model):
name = models.CharField(max_length=100)
def __str__(self):
return self.name
重新運(yùn)行就會(huì)顯示名字了, 會(huì)發(fā)現(xiàn)之前在網(wǎng)站增加的名字也在這里顯示了
Category.objects.all()
Out[2]: <QuerySet [<Category: Python>, <Category: Django>, <Category: Flask>]>
```
**改(Update)**: 修改之前存放的數(shù)據(jù),相當(dāng)于重命名
```
c = Category.objects.get(name="Flask")
# 或者可以用篩選的方式
# c.Cateogry.objects.filter(name="Flask")
c.name = "flask"
c.save()
Category.objects.all()
```
**刪(Delte)**: 刪除不需要的數(shù)據(jù)
```
c = Category.obejcts.get(name="flask")
c.delete()
Category.objects.all()
```
**注**:這里涉及了一些面向?qū)ο缶幊痰闹R(shí),需要抽空看看